lib/arkana/swift_code_generator.rb
# frozen_string_literal: true
require "erb" unless defined?(Erb)
require "fileutils" unless defined?(FileUtils)
require_relative "helpers/string"
# Responsible for generating Swift source and test files.
module SwiftCodeGenerator
# Generates Swift code and test files for the given template arguments.
def self.generate(template_arguments:, config:)
interface_swift_package_dir = File.join(config.result_path, "#{config.import_name}Interfaces")
set_up_interfaces_swift_package(interface_swift_package_dir, template_arguments, config)
swift_package_dir = File.join(config.result_path, config.import_name)
set_up_swift_package(swift_package_dir, template_arguments, config)
end
def self.set_up_interfaces_swift_package(path, template_arguments, config)
dirname = File.dirname(__FILE__)
readme_template = File.read("#{dirname}/templates/swift/interfaces_readme.erb")
package_template = File.read("#{dirname}/templates/swift/interfaces_package.swift.erb")
podspec_template = File.read("#{dirname}/templates/swift/interfaces.podspec.erb")
sources_dir = File.join(path, "Sources")
source_template = File.read("#{dirname}/templates/swift/arkana_protocol.swift.erb")
FileUtils.mkdir_p(path)
FileUtils.mkdir_p(sources_dir)
render(podspec_template, template_arguments, File.join(path, "#{config.pod_name.capitalize_first_letter}Interfaces.podspec")) if config.package_manager == "cocoapods"
render(readme_template, template_arguments, File.join(path, "README.md"))
render(package_template, template_arguments, File.join(path, "Package.swift"))
render(source_template, template_arguments, File.join(sources_dir, "#{config.import_name}Interfaces.swift"))
end
def self.set_up_swift_package(path, template_arguments, config)
dirname = File.dirname(__FILE__)
readme_template = File.read("#{dirname}/templates/readme.erb")
package_template = File.read("#{dirname}/templates/swift/package.swift.erb")
sources_dir = File.join(path, "Sources")
source_template = File.read("#{dirname}/templates/swift/arkana.swift.erb")
tests_dir = File.join(path, "Tests") if config.should_generate_unit_tests
tests_template = File.read("#{dirname}/templates/swift/arkana_tests.swift.erb")
podspec_template = File.read("#{dirname}/templates/swift/arkana.podspec.erb")
FileUtils.mkdir_p(path)
FileUtils.mkdir_p(sources_dir)
FileUtils.mkdir_p(tests_dir) if config.should_generate_unit_tests
render(readme_template, template_arguments, File.join(path, "README.md"))
render(package_template, template_arguments, File.join(path, "Package.swift"))
render(podspec_template, template_arguments, File.join(path, "#{config.pod_name.capitalize_first_letter}.podspec")) if config.package_manager == "cocoapods"
render(source_template, template_arguments, File.join(sources_dir, "#{config.import_name}.swift"))
render(tests_template, template_arguments, File.join(tests_dir, "#{config.import_name}Tests.swift")) if config.should_generate_unit_tests
end
def self.render(template, template_arguments, destination_file)
renderer = ERB.new(template, trim_mode: ">") # Don't automatically add newlines at the end of each template tag
result = renderer.result(template_arguments.get_binding)
File.write(destination_file, result)
end
end