$definition_file = nil

require 'fileutils' require “swift_generator/version” require “swift_generator/code_generation/swift_class_generation”

module SwiftGenerator

def write_files_for_definition_set( definition_set )

for _, f in definition_set.output_files
    SwiftGenerator::writeGeneratedFile( f )
end

end

module_function :write_files_for_definition_set

# files = YAML::load(File.open(ARGV))

# Templated Output Methods def write_element( element )

if( element.kind_of? SwiftCategory )
  SwiftGenerator::write_category( element )
elsif( element.kind_of? SwiftProtocol )
  SwiftGenerator::write_protocol( element )
elsif( element.kind_of? SwiftEnum )
  SwiftGenerator::write_enum( element )
elsif( element.kind_of? SwiftClass )      # Must be last as it is the superclass
  SwiftGenerator::write_class( element )
end

end

module_function :write_element

def writeGeneratedFile( f )

return if ( f.is_user_file && File.exist?( f.file_path ))

Pathname.new( f.file_path ).parent().mkpath()

./!output( f.file_path )

.// .// @{ Pathname.new( f.file_name ).basename } .// @{f.company_name} if $definition_file .// .// Generated from @{$definition_file} on @{Time.now.strftime(“%d/%m/%Y %H:%M”)} end if f.include_editing_warnings

if !f.is_user_file

.// .// WARNING: This entire file is generated. DO NOT EDIT.

else

.// .// This is a user-editable generated file. Delete or rename this file to have a new empty file generated

end

end .// .// Copyright © @{Time.now.strftime(“”)} @{f.company_name}, Inc. All rights reserved. .//

for import_statement in f.import_statements.sort

.&{import_statement}

  end

for element in f.elements
  SwiftGenerator::write_element(element)
end

end

module_function :writeGeneratedFile

def write_enum( e ) . . .&{e.access_control_modifier}enum @{e.type_name}

if e.inheritance_list.count > 0

. /+ : @{e.inheritance_list.join( “, ” )}

end

. /+ {

e.enum_cases.each_with_index do |enum_case, _|
  enum_case.declaration_lines().each do |declLine|

. &{declLine}

  end
end

e.properties.each_with_index do |prop, i|

.

prop.declaration_lines().each do |declLine|

. &{declLine}

  end
end

SwiftGenerator::write_methods( e.methods )

. } end module_function :write_enum

def write_class( c ) . . .&{c.access_control_modifier}class @{c.type_name}

if c.inheritance_list.count > 0

. /+ : @{c.inheritance_list.join( “, ” )}

end

. /+ {

SwiftGenerator::write_class_body( c )

.} end module_function :write_class

def write_category( c ) . . .&{c.access_control_modifier}extension @{c.categorized_class_name} /*@{c.type_name || ' '}*/ {

SwiftGenerator::write_class_body( c )

.} end module_function :write_category

def write_class_body( c )

c.top_inner_comment_block().each do |line|

. &{line}

  end

# SwiftGenerator::write_property_declarations( c.transient_properties, "Transient" )
# SwiftGenerator::write_property_declarations( c.persistent_properties, "Persistent" )
SwiftGenerator::write_property_declarations( c.transient_properties )
SwiftGenerator::write_property_declarations( c.persistent_properties )

SwiftGenerator::write_methods( c.initializers )
SwiftGenerator::write_methods( c.methods )

end module_function :write_class_body

def write_protocol( p ) . . .&{p.access_control_modifier}protocol @{p.type_name}

if p.inheritance_list.count > 0

. /+ : @{p.inheritance_list.join( “, ” )}

end

. /+ {

# SwiftGenerator::write_property_declarations( c.transient_properties, "Transient" )
# SwiftGenerator::write_property_declarations( c.persistent_properties, "Persistent" )
SwiftGenerator::write_property_declarations( p.transient_properties )
SwiftGenerator::write_property_declarations( p.persistent_properties )

SwiftGenerator::write_methods( p.initializers, for_protocol=true )
SwiftGenerator::write_methods( p.methods, for_protocol=true )

.} end module_function :write_protocol

def write_property_declarations( properties, property_type_label=nil )

properties.each_with_index do |prop, i|
  if i == 0 && ! property_type_label.nil?

. . // MARK: @{property_type_label} Properties

end
prop.declaration_lines().each do |declLine|

. &{declLine}

  end
end

end

module_function :write_property_declarations

def write_methods( methods, for_protocol=false )

methods.each_with_index do |m, i|
    overrideString = m.override ? 'override ' : ''

.

if ! m.comment.nil?

. &{m.comment}

end
args = m.argStr.nil? || m.argStr.empty? ? m.argStr : ' ' + m.argStr + ' '
access_control_modifier_str = m.access_control_modifiers.length > 0 ? m.access_control_modifiers.join( ", " ) + " " : ""

. &{overrideString}&{access_control_modifier_str}&{m.func_fragment + “ ” unless m.func_fragment.length == 0}@{m.name}(&{args})

if ! (m.returns.nil? || m.returns.length == 0 )

. /+ -> @{m.returns}

end
unless for_protocol

. /+ {

m.bodyLines.each do |line|

. &{line}

end

. }

  end
end

end

module_function :write_methods

end