-
Notifications
You must be signed in to change notification settings - Fork 727
/
ThirdPartyResourceTypeLoader.cs
88 lines (71 loc) · 3.25 KB
/
ThirdPartyResourceTypeLoader.cs
1
2
3
4
5
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System.Collections.Immutable;
using Azure.Bicep.Types;
using Azure.Bicep.Types.Index;
using Bicep.Core.Resources;
using Bicep.Core.TypeSystem.Types;
using ObjectType = Azure.Bicep.Types.Concrete.ObjectType;
namespace Bicep.Core.TypeSystem.Providers.ThirdParty
{
public class ThirdPartyResourceTypeLoader : IResourceTypeLoader
{
public record NamespaceConfiguration(string Name, string Version, bool IsSingleton, TypeSymbol? ConfigurationObject);
private readonly ITypeLoader typeLoader;
private readonly ExtensibilityResourceTypeFactory resourceTypeFactory;
private readonly ImmutableDictionary<ResourceTypeReference, CrossFileTypeReference> availableTypes;
private readonly TypeSettings? typeSettings;
private readonly CrossFileTypeReference? fallbackResourceType;
public ThirdPartyResourceTypeLoader(ITypeLoader typeLoader)
{
this.typeLoader = typeLoader;
resourceTypeFactory = new ExtensibilityResourceTypeFactory();
var indexedTypes = typeLoader.LoadTypeIndex();
availableTypes = indexedTypes.Resources.ToImmutableDictionary(
kvp => ResourceTypeReference.Parse(kvp.Key),
kvp => kvp.Value);
typeSettings = indexedTypes.Settings;
fallbackResourceType = indexedTypes.FallbackResourceType;
}
public IEnumerable<ResourceTypeReference> GetAvailableTypes()
=> availableTypes.Keys;
public ResourceTypeComponents LoadType(ResourceTypeReference reference)
{
var typeLocation = availableTypes[reference];
var serializedResourceType = typeLoader.LoadResourceType(typeLocation);
return resourceTypeFactory.GetResourceType(serializedResourceType);
}
public ResourceTypeComponents? LoadFallbackResourceType()
{
if (fallbackResourceType != null)
{
var serializedResourceType = typeLoader.LoadResourceType(fallbackResourceType);
return resourceTypeFactory.GetResourceType(serializedResourceType);
}
// No fallback type provided in JSON
return null;
}
public NamespaceConfiguration? LoadNamespaceConfiguration()
{
if (typeSettings == null)
{
throw new ArgumentException($"Please provide the following Settings properties: Name, Version, & IsSingleton.");
}
TypeSymbol? configurationType = null;
if (typeSettings.ConfigurationType is { } reference)
{
if (typeLoader.LoadType(reference) is not ObjectType objectType)
{
throw new ArgumentException($"Unable to locate resource object type at index {reference.Index} in \"{reference.RelativePath}\" resource");
}
var bodyType = resourceTypeFactory.GetObjectType(objectType);
configurationType = bodyType;
}
return new(
typeSettings.Name,
typeSettings.Version,
typeSettings.IsSingleton,
configurationType);
}
}
}