class ApiConverter
Attributes
api_hash[R]
Public Class Methods
new(api_json)
click to toggle source
# File lib/code_generator/api_converter.rb, line 13 def initialize(api_json) @api_hash = JSON.parse(api_json) end
Public Instance Methods
convert()
click to toggle source
# File lib/code_generator/api_converter.rb, line 17 def convert ruby_types = ApiRubyTypes.new(version: api_hash['version'], modules: []) (api_hash['modules'] || []).each do |mod| new_mod = convert_module(mod) ruby_types.modules << new_mod ruby_types.all_types.merge!(new_mod.types_hash) end ruby_types end
Private Instance Methods
checkFunctionName(name)
click to toggle source
# File lib/code_generator/api_converter.rb, line 147 def checkFunctionName(name) result = "" raise "Property Name is nil" unless name case name when "init" result = "init" else result = name end return result end
checkPropertyName(name)
click to toggle source
# File lib/code_generator/api_converter.rb, line 133 def checkPropertyName(name) result = "" raise "Property Name is nil" unless name case name when "public" result = "public" else result = name end return result end
convertEnumOfConsts(from)
click to toggle source
# File lib/code_generator/api_converter.rb, line 164 def convertEnumOfConsts(from) result = TypeEnum.new(name: "#{lib_prefix}#{from['name']}", parents: [], cases: [], summary: from['summary'], description: from['description']) (from['enum_consts'] || []).each do |enumConst| caseName = enumConst['name'] caseValue = enumConst['value'] result.cases << EnumCase.new(name: caseName, value: caseValue, summary: enumConst['summary'], description: enumConst['description']) end return result end
convertStruct(from)
click to toggle source
# File lib/code_generator/api_converter.rb, line 111 def convertStruct(from) result = TypeStruct.new(name: "#{lib_prefix}#{from['name']}", parents: [], fields: [], functions: []) (from['struct_fields'] || []).each do |field| if isValidPropertyName(field['name']) type = generateType(field) if ( (from['name'] || "")[/Params/] || (field['name'] || "")[/input/]) && type[/Value/] type = "Value" elsif (field['name'] || "")[/^dictionary$/] type = "#{lib_prefix}MnemonicDictionary" elsif type[/Abi<Optional>/] type = "Value<Optional>" elsif type[/Abi/] type = "Value" end property = StructField.new(name: checkPropertyName(field['name']), type: type, summary: field['summary'], description: field['description']) result.fields << property end end result end
convertTypeAlias(from)
click to toggle source
# File lib/code_generator/api_converter.rb, line 107 def convertTypeAlias(from) TypeAlias.new(name: "#{lib_prefix}#{from['name']}", type: generateType(from)) end
convert_fucking_enum_of_types(enum)
click to toggle source
# File lib/code_generator/api_converter.rb, line 175 def convert_fucking_enum_of_types(enum) result = [ TypeEnum.new(name: generate_enum_name(enum['name']), parents: [], cases: []), TypeStruct.new(name: generate_struct_name(enum['name']), parents: [], fields: [], functions: [], summary: enum['summary'], description: enum['description']) ] properties_name_set = Set.new properties = [] (enum['enum_types'] || []).each do |enum_type| result[0].cases << EnumCase.new(name: enum_type['name'], value: enum_type['name']) (enum_type['struct_fields'] || []).each do |field| if !properties_name_set.include?(field['name']) properties << field end properties_name_set << field['name'] end end result[1].fields << StructField.new(name: "type", type: generate_enum_name(enum['name'])) properties.each do |property| type = generateType(property) if property['name'][/^dictionary$/] type = "#{lib_prefix}MnemonicDictionary" end result[1].fields << StructField.new(name: property['name'], type: type, summary: property['summary'], description: property['description']) end result end
convert_module(mod)
click to toggle source
# File lib/code_generator/api_converter.rb, line 31 def convert_module(mod) new_module = Module.new(name: mod['name'], alias: [], functions: [], enums: [], types: [], summary: mod['summary'], description: mod['description']) (mod['types'] || []).each do |type| if type['type'] == 'EnumOfTypes' new_enum, new_struct = convert_fucking_enum_of_types(type) new_module.enums << new_enum new_module.types << new_struct new_module.types_hash[new_enum.name] = new_enum new_module.types_hash[new_struct.name] = new_struct elsif type['type'] == 'EnumOfConsts' new_type = convertEnumOfConsts(type) new_module.enums << new_type new_module.types_hash[new_type.name] = new_type elsif type['type'] == 'Struct' new_type = convertStruct(type) new_module.types << new_type new_module.types_hash[new_type.name] = new_type elsif type['type'] == 'Number' new_type = convertTypeAlias(type) new_module.alias << new_type new_module.types_hash[new_type.name] = new_type else raise "Unkown NEW TYPE for module #{type['name']} \"types\": #{type['types']}" end end # /// FUNCTIONS (mod['functions'] || []).each do |function| result = "" if function['result']['type'] == "Generic" ref_type = function['result']['generic_args'].first&.send(:[], 'type') || "" if ref_type == "Ref" ref_name = function['result']['generic_args'].first&.send(:[], 'ref_name') || "" if ref_name[/^(.+)\.(.+)$/] mod = $1 type = $2 result = "#{lib_prefix}#{type}" else raise "Bad function result ref_name: #{ref_name}, function name: #{function['name']}, result: #{function['result']}" end elsif ref_type == "None" result = "Void" end else raise "New function result type !" end # /// function newFunction = StructFunction.new(name: checkFunctionName(function['name']), arguments: [], result: result, summary: function['summary'], description: function['description']) # /// FUNCTION PARAMETERS paramsCount = 0 (function['params'] || []).each do |parameter| if parameter['name'] == "params" paramsCount += 1 if parameter['type'] == "Ref" ref_name = parameter['ref_name'] || "" if ref_name[/^(.+)\.(.+)$/] mod = $1 type = $2 newFunction.arguments << FunctionArgument.new(name: "payload", type: "#{lib_prefix}#{type}") else raise "Bad function params ref_name: #{ref_name}, function name: #{function['name']}, result: #{function['result']}" end else raise "NEW CASE! New parameter type: #{parameter['type']}" end end raise "NEW CASE ! More then one parameter for functions !" if paramsCount > 1 end new_module.functions << newFunction end new_module end
generateRefType(type)
click to toggle source
# File lib/code_generator/api_converter.rb, line 220 def generateRefType(type) result = "" if type[/(.+)\.(.+)/] mod = $1 typeName = $2 result = "#{lib_prefix}#{typeName}" else result = "#{lib_prefix}#{type}" end result end
generateSimpleType(type)
click to toggle source
# File lib/code_generator/api_converter.rb, line 203 def generateSimpleType(type) tempType = "" if type['type'] == "Ref" if type['ref_name'] == "Value" || type['ref_name'] == "API" tempType = "Value" else return type['optional'] ? "#{generateRefType(type['ref_name'] || "nil")}<Optional>" : generateRefType(type['ref_name'] || "nil") end else tempType = type['type'] end tempType = "#{tempType}<Optional>" if type['optional'] tempType end
generateType(type)
click to toggle source
# File lib/code_generator/api_converter.rb, line 234 def generateType(type) if type['type'] == "Optional" && type['optional_inner'] type['optional'] = true type['optional_inner']['optional'] = true if type['optional_inner']['type'] == "Optional" return generateType(type['optional_inner']) else return generateSimpleType(type['optional_inner']) end else return generateSimpleType(type) end end
generate_enum_name(name)
click to toggle source
# File lib/code_generator/api_converter.rb, line 248 def generate_enum_name(name) "#{lib_prefix}#{name}#{lib_enum_postfix}" end
generate_struct_name(name)
click to toggle source
# File lib/code_generator/api_converter.rb, line 252 def generate_struct_name(name) "#{lib_prefix}#{name}" end
isValidPropertyName(name)
click to toggle source
# File lib/code_generator/api_converter.rb, line 160 def isValidPropertyName(name) !(name || " ")[/\s/] end