64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
# File 'foobara-0.0.110/projects/command/src/command_pattern_implementation/concerns/domain_mappers.rb', line 64
def run_mapped_subcommand!(subcommand_class, unmapped_inputs = {}, to = nil)
unless subcommand_class
raise ArgumentError, "subcommand_class is required"
end
mapped_something = false
no_mapper_found = nil
criteria = self.class.domain_map_criteria
inputs_mapper = self.class.domain.lookup_matching_domain_mapper(
from: unmapped_inputs,
to: subcommand_class,
criteria:,
strict: true
)
inputs = if inputs_mapper
mapped_something = true
run_subcommand!(inputs_mapper, from: unmapped_inputs)
else
unmapped_inputs
end
result_mapper = if subcommand_class.result_type
mapper = self.class.domain.lookup_matching_domain_mapper(
from: subcommand_class.result_type,
to:,
criteria:,
strict: true
)
no_mapper_found = mapper.nil? && inputs_mapper.nil?
mapper
end
result = unless no_mapper_found
run_subcommand!(subcommand_class, inputs)
end
unless subcommand_class.result_type
result_mapper = self.class.domain.lookup_matching_domain_mapper(
from: result,
to:,
criteria:,
strict: true
)
end
if result_mapper
mapped_something = true
result = run_subcommand!(result_mapper, from: result)
end
unless mapped_something
if criteria
mapper = self.class.domain.lookup_matching_domain_mapper(
from: unmapped_inputs,
to: subcommand_class,
strict: true
)
if mapper
raise ForgotToDependOnDomainMapperError, mapper
end
mapper = self.class.domain.lookup_matching_domain_mapper(
from: subcommand_class.result_type,
to:,
strict: true
)
if mapper
raise ForgotToDependOnDomainMapperError, mapper
end
end
raise NoDomainMapperFoundError.new(subcommand_class, to)
end
result
end
|