require 'mxx_ru/cpp'

module	Oess_1
module	Util_cpp_serializer
	# Класс генератора .cpp файлов из .ddl файлов.
	class	Gen < Mxx_ru::Abstract_generator
		def	initialize(
			# Цель, в которую будет входить данный генератор.
			a_target,
			# Расширение, которое нужно использовать для сгенерированных файлов.
			a_cpp_ext = ".cpp" )

			@ddl_files = Array.new
			@cpp_ext = a_cpp_ext

			# Объект-цель должна быть производной от Mxx_ru::Cpp::Target.
			if !a_target.kind_of?( Mxx_ru::Cpp::Target )
				raise Mxx_ru::Unsupported_target_type.new(
					"Oess_1::Util_cpp_serializer::Gen",
					a_target.class.name )
			end

			@target = a_target

			# В цель-владелец нужно добавить два необходимых проекта.
			a_target.required_prj( "oess_1/stdsn/prj.rb" )
			a_target.required_prj( "oess_1/util_cpp_serializer/prj.rb" )
		end

		# Добавить очередной файл.
		def	ddl_file( a_file )
			@ddl_files << @target.create_full_src_file_name( a_file )
		end

		# Сгенерировать из DDL-файлов C++ файлы.
		def	build( target )
			@ddl_files.each { |f|
					generated_file = create_cpp_file_name( f )

					if Mxx_ru::Target_state::EXISTS != Mxx_ru::Target_state::detect(
						generated_file, [ f ] ).state

						# Берем полное имя построителя вспомогательного кода.
						serializer_name = Mxx_ru::query_target(
								"oess_1/util_cpp_serializer/prj.rb", true
							).mxx_full_targets_names[ 0 ]

						Mxx_ru::Abstract_target::run(
							[ "#{serializer_name} #{f} #{generated_file}" ],
							[ generated_file ] )
					end
				}
		end

		# Удалить сгенерированные из DLL С++ файлы.
		def	clean( target )
			@ddl_files.each { |f|
					generated_file = create_cpp_file_name( f )
					Mxx_ru::Util::delete_file( generated_file )
				}
		end

	protected
		def	create_cpp_file_name( a_ddl_file )
			return a_ddl_file + @cpp_ext
		end
	end
end
end
