$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[0])) # 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 (c) @{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