6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'lib/puppet/pops/loader/type_definition_instantiator.rb', line 6
def self.create(loader, typed_name, source_ref, pp_code_string)
parser = Parser::EvaluatingParser.new()
model = parser.parse_string(pp_code_string, source_ref).model
name = typed_name.name
case model.definitions.size
when 0
raise ArgumentError, "The code loaded from #{source_ref} does not define the type '#{name}' - it is empty."
when 1
else
raise ArgumentError,
"The code loaded from #{source_ref} must contain only the type '#{name}' - it has additional definitions."
end
type_definition = model.definitions[0]
unless type_definition.is_a?(Model::TypeAlias) || type_definition.is_a?(Model::TypeDefinition)
raise ArgumentError,
"The code loaded from #{source_ref} does not define the type '#{name}' - no type alias or type definition found."
end
actual_name = type_definition.name
unless name == actual_name.downcase
raise ArgumentError,
"The code loaded from #{source_ref} produced type with the wrong name, expected '#{name}', actual '#{actual_name}'"
end
unless model.body == type_definition
raise ArgumentError,
"The code loaded from #{source_ref} contains additional logic - can only contain the type '#{name}'"
end
private_loader = loader.private_loader
Adapters::LoaderAdapter.adapt(type_definition).loader = private_loader
Types::PTypeAliasType.new(name, type_definition.type_expr)
end
|