Class: SorobanRustBackend::UserDefinedTypesHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/user_defined_types_handler.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user_defined_type) ⇒ UserDefinedTypesHandler

Returns a new instance of UserDefinedTypesHandler.



3
4
5
# File 'lib/user_defined_types_handler.rb', line 3

def initialize(user_defined_type)
  @user_defined_type = user_defined_type
end

Class Method Details

.generate(user_defined_type) ⇒ Object



7
8
9
# File 'lib/user_defined_types_handler.rb', line 7

def self.generate(user_defined_type)
  new(user_defined_type).generate
end

Instance Method Details

#derivesObject



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/user_defined_types_handler.rb', line 56

def derives
  base = if error? && enum?
           "#[contracterror]\n#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\n"
         else
           "#[contracttype]\n#[derive(Clone, Debug, Eq, PartialEq)]\n"
         end

  base += "#[repr(u32)]\n" if numbered_enum?

  base
end

#enum?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/user_defined_types_handler.rb', line 77

def enum?
  @user_defined_type.name.end_with? '_ENUM'
end

#error?Boolean

TODO: fix this terrible hack

Returns:

  • (Boolean)


69
70
71
# File 'lib/user_defined_types_handler.rb', line 69

def error?
  @user_defined_type.name.start_with? 'Error'
end

#generateObject



11
12
13
14
15
16
17
# File 'lib/user_defined_types_handler.rb', line 11

def generate
  if struct?
    generate_struct
  elsif enum?
    generate_enum
  end
end

#generate_enumObject



29
30
31
# File 'lib/user_defined_types_handler.rb', line 29

def generate_enum
  "#{derives}pub enum #{@user_defined_type.name.gsub('_ENUM', '')} {\n#{generate_enum_attributes}\n}\n\n"
end

#generate_enum_attributesObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/user_defined_types_handler.rb', line 33

def generate_enum_attributes
  @user_defined_type.attributes.map do |x|
    if x[:value]
      "    #{x[:name]} = #{x[:value]},"
    elsif x[:type]&.start_with?('(') && x[:type]&.end_with?(')')
      inner_types = x[:type].gsub('(', '').gsub(')', '').split(',').map do |x|
        Common::TypeTranslator.translate_type(x)
      end
      if inner_types.empty? || x[:type] == '()'
        "    #{x[:name]},"
      else
        "    #{x[:name]}(#{inner_types.join(', ')}),"
      end
    elsif x[:type]&.match(/\d+/)
      "    #{x[:name]} = #{x[:type]},"
    elsif x[:type] && x[:type] != '()'
      "    #{x[:name]}(#{Common::TypeTranslator.translate_type(x[:type])}),"
    else
      "    #{x[:name]},"
    end
  end.join("\n")
end

#generate_structObject



19
20
21
# File 'lib/user_defined_types_handler.rb', line 19

def generate_struct
  "#{derives}pub struct #{@user_defined_type.name.gsub('_STRUCT', '')} {\n#{generate_struct_attributes}\n}\n\n"
end

#generate_struct_attributesObject



23
24
25
26
27
# File 'lib/user_defined_types_handler.rb', line 23

def generate_struct_attributes
  @user_defined_type.attributes.map do |x|
    "    pub #{x[:name]}: #{Common::TypeTranslator.translate_type(x[:type])},"
  end.join("\n")
end

#numbered_enum?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/user_defined_types_handler.rb', line 81

def numbered_enum?
  enum? && @user_defined_type.attributes.all? { |x| x[:value] }
end

#struct?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/user_defined_types_handler.rb', line 73

def struct?
  @user_defined_type.name.end_with? '_STRUCT'
end