Class: SorobanRustBackend::UserDefinedTypesHandler
- Inherits:
-
Object
- Object
- SorobanRustBackend::UserDefinedTypesHandler
- Defined in:
- lib/user_defined_types_handler.rb
Class Method Summary collapse
Instance Method Summary collapse
- #derives ⇒ Object
- #enum? ⇒ Boolean
-
#error? ⇒ Boolean
TODO: fix this terrible hack.
- #generate ⇒ Object
- #generate_enum ⇒ Object
- #generate_enum_attributes ⇒ Object
- #generate_struct ⇒ Object
- #generate_struct_attributes ⇒ Object
-
#initialize(user_defined_type) ⇒ UserDefinedTypesHandler
constructor
A new instance of UserDefinedTypesHandler.
- #numbered_enum? ⇒ Boolean
- #struct? ⇒ Boolean
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
#derives ⇒ Object
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
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
69 70 71 |
# File 'lib/user_defined_types_handler.rb', line 69 def error? @user_defined_type.name.start_with? 'Error' end |
#generate ⇒ Object
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_enum ⇒ Object
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_attributes ⇒ Object
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_struct ⇒ Object
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_attributes ⇒ Object
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
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
73 74 75 |
# File 'lib/user_defined_types_handler.rb', line 73 def struct? @user_defined_type.name.end_with? '_STRUCT' end |