class Object

Public Instance Methods

generate_serializers() click to toggle source
# File lib/serde/generate.rb, line 13
def generate_serializers # rubocop:disable Metrics/MethodLength
  modules = []

  Serde.subclasses.each do |klass|
    schema = klass.instance_variable_get(:@schema)
    raise 'pls define a schema' if schema.nil?

    module_name = underscore(klass.name)
    fields = schema.map do |k, v|
      type =
        case v.to_s
        when 'Integer' then 'i64'
        when 'Float' then 'f64'
        else v.to_s
        end
      { name: k, type: type }
    end

    modules << {
      class_name: klass.name,
      name: module_name,
      fields: fields,
      joint_fields: fields.map do |field|
        "#{field[:name]}: #{field[:type]}"
      end.join(', '),
    }

    mod_template = ERB.new(File.read('./rust_template/mod.rs.erb'))
    compiled_template = mod_template.result(binding)

    File.open("./src/#{module_name}.rs", 'w') { |f| f.write(compiled_template) }
  end

  lib_template = ERB.new(File.read('./rust_template/lib.rs.erb'))
  compiled_template = lib_template.result(binding)

  File.open('./src/lib.rs', 'w') { |f| f.write(compiled_template) }

  `rake build`
end
underscore(str) click to toggle source
# File lib/serde/generate.rb, line 5
def underscore(str)
  str.tr('::', '/')
     .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
     .gsub(/([a-z\d])([A-Z])/, '\1_\2')
     .tr('-', '_')
     .downcase
end