|
1 | | -namespace Microsoft.ComponentDetection.Detectors.Uv |
| 1 | +namespace Microsoft.ComponentDetection.Detectors.Uv; |
| 2 | + |
| 3 | +using System; |
| 4 | +using System.Collections.Generic; |
| 5 | +using System.IO; |
| 6 | +using Tomlyn; |
| 7 | +using Tomlyn.Model; |
| 8 | + |
| 9 | +public class UvLock |
2 | 10 | { |
3 | | - using System; |
4 | | - using System.Collections.Generic; |
5 | | - using System.IO; |
6 | | - using Tomlyn; |
7 | | - using Tomlyn.Model; |
| 11 | + // a list of packages with their dependencies |
| 12 | + public List<UvPackage> Packages { get; set; } = []; |
8 | 13 |
|
9 | | - public class UvLock |
| 14 | + // static method to parse the TOML stream into a UvLock model |
| 15 | + public static UvLock Parse(Stream tomlStream) |
10 | 16 | { |
11 | | - // a list of packages with their dependencies |
12 | | - public List<UvPackage> Packages { get; set; } = []; |
| 17 | + using var reader = new StreamReader(tomlStream); |
| 18 | + var tomlContent = reader.ReadToEnd(); |
| 19 | + var model = Toml.ToModel(tomlContent); |
| 20 | + return new UvLock |
| 21 | + { |
| 22 | + Packages = ParsePackagesFromModel(model), |
| 23 | + }; |
| 24 | + } |
13 | 25 |
|
14 | | - // static method to parse the TOML stream into a UvLock model |
15 | | - public static UvLock Parse(Stream tomlStream) |
| 26 | + internal static List<UvPackage> ParsePackagesFromModel(object? model) |
| 27 | + { |
| 28 | + if (model is not TomlTable table) |
16 | 29 | { |
17 | | - using var reader = new StreamReader(tomlStream); |
18 | | - var tomlContent = reader.ReadToEnd(); |
19 | | - var model = Toml.ToModel(tomlContent); |
20 | | - return new UvLock |
21 | | - { |
22 | | - Packages = ParsePackagesFromModel(model), |
23 | | - }; |
| 30 | + throw new InvalidOperationException("TOML root is not a table"); |
24 | 31 | } |
25 | 32 |
|
26 | | - internal static List<UvPackage> ParsePackagesFromModel(object? model) |
| 33 | + if (!table.TryGetValue("package", out var packagesObj) || packagesObj is not TomlTableArray packages) |
27 | 34 | { |
28 | | - if (model is not TomlTable table) |
29 | | - { |
30 | | - throw new InvalidOperationException("TOML root is not a table"); |
31 | | - } |
| 35 | + return []; |
| 36 | + } |
32 | 37 |
|
33 | | - if (!table.TryGetValue("package", out var packagesObj) || packagesObj is not TomlTableArray packages) |
| 38 | + var result = new List<UvPackage>(); |
| 39 | + foreach (var pkg in packages) |
| 40 | + { |
| 41 | + var parsed = ParsePackage(pkg); |
| 42 | + if (parsed is not null) |
34 | 43 | { |
35 | | - return []; |
| 44 | + result.Add(parsed); |
36 | 45 | } |
| 46 | + } |
37 | 47 |
|
38 | | - var result = new List<UvPackage>(); |
39 | | - foreach (var pkg in packages) |
40 | | - { |
41 | | - var parsed = ParsePackage(pkg); |
42 | | - if (parsed is not null) |
43 | | - { |
44 | | - result.Add(parsed); |
45 | | - } |
46 | | - } |
| 48 | + return result; |
| 49 | + } |
47 | 50 |
|
48 | | - return result; |
| 51 | + internal static UvPackage? ParsePackage(object? pkg) |
| 52 | + { |
| 53 | + if (pkg is not TomlTable pkgTable) |
| 54 | + { |
| 55 | + return null; |
49 | 56 | } |
50 | 57 |
|
51 | | - internal static UvPackage? ParsePackage(object? pkg) |
| 58 | + if (pkgTable.TryGetValue("name", out var nameObj) && nameObj is string name && |
| 59 | + pkgTable.TryGetValue("version", out var versionObj) && versionObj is string version) |
52 | 60 | { |
53 | | - if (pkg is not TomlTable pkgTable) |
| 61 | + var uvPackage = new UvPackage |
54 | 62 | { |
55 | | - return null; |
56 | | - } |
| 63 | + Name = name, |
| 64 | + Version = version, |
| 65 | + Dependencies = [], |
| 66 | + MetadataRequiresDist = [], |
| 67 | + MetadataRequiresDev = [], |
| 68 | + }; |
57 | 69 |
|
58 | | - if (pkgTable.TryGetValue("name", out var nameObj) && nameObj is string name && |
59 | | - pkgTable.TryGetValue("version", out var versionObj) && versionObj is string version) |
| 70 | + if (pkgTable.TryGetValue("dependencies", out var depsObj) && depsObj is TomlArray depsArray) |
60 | 71 | { |
61 | | - var uvPackage = new UvPackage |
62 | | - { |
63 | | - Name = name, |
64 | | - Version = version, |
65 | | - Dependencies = [], |
66 | | - MetadataRequiresDist = [], |
67 | | - MetadataRequiresDev = [], |
68 | | - }; |
69 | | - |
70 | | - if (pkgTable.TryGetValue("dependencies", out var depsObj) && depsObj is TomlArray depsArray) |
71 | | - { |
72 | | - uvPackage.Dependencies = ParseDependenciesArray(depsArray); |
73 | | - } |
74 | | - |
75 | | - if (pkgTable.TryGetValue("metadata", out var metadataObj) && metadataObj is TomlTable metadataTable) |
76 | | - { |
77 | | - ParseMetadata(metadataTable, uvPackage); |
78 | | - } |
79 | | - |
80 | | - // Parse source |
81 | | - if (pkgTable.TryGetValue("source", out var sourceObj) && sourceObj is TomlTable sourceTable) |
82 | | - { |
83 | | - var source = new UvSource |
84 | | - { |
85 | | - Registry = sourceTable.TryGetValue("registry", out var regObj) && regObj is string reg ? reg : null, |
86 | | - Virtual = sourceTable.TryGetValue("virtual", out var virtObj) && virtObj is string virt ? virt : null, |
87 | | - }; |
88 | | - uvPackage.Source = source; |
89 | | - } |
90 | | - |
91 | | - return uvPackage; |
| 72 | + uvPackage.Dependencies = ParseDependenciesArray(depsArray); |
92 | 73 | } |
93 | 74 |
|
94 | | - return null; |
95 | | - } |
96 | | - |
97 | | - internal static List<UvDependency> ParseDependenciesArray(TomlArray? depsArray) |
98 | | - { |
99 | | - var deps = new List<UvDependency>(); |
100 | | - if (depsArray is null) |
| 75 | + if (pkgTable.TryGetValue("metadata", out var metadataObj) && metadataObj is TomlTable metadataTable) |
101 | 76 | { |
102 | | - return deps; |
| 77 | + ParseMetadata(metadataTable, uvPackage); |
103 | 78 | } |
104 | 79 |
|
105 | | - foreach (var dep in depsArray) |
| 80 | + // Parse source |
| 81 | + if (pkgTable.TryGetValue("source", out var sourceObj) && sourceObj is TomlTable sourceTable) |
106 | 82 | { |
107 | | - if (dep is TomlTable depTable && |
108 | | - depTable.TryGetValue("name", out var depNameObj) && depNameObj is string depName) |
| 83 | + var source = new UvSource |
109 | 84 | { |
110 | | - var depSpec = depTable.TryGetValue("specifier", out var specObj) && specObj is string s ? s : null; |
111 | | - deps.Add(new UvDependency |
112 | | - { |
113 | | - Name = depName, |
114 | | - Specifier = depSpec, |
115 | | - }); |
116 | | - } |
| 85 | + Registry = sourceTable.TryGetValue("registry", out var regObj) && regObj is string reg ? reg : null, |
| 86 | + Virtual = sourceTable.TryGetValue("virtual", out var virtObj) && virtObj is string virt ? virt : null, |
| 87 | + }; |
| 88 | + uvPackage.Source = source; |
117 | 89 | } |
118 | 90 |
|
| 91 | + return uvPackage; |
| 92 | + } |
| 93 | + |
| 94 | + return null; |
| 95 | + } |
| 96 | + |
| 97 | + internal static List<UvDependency> ParseDependenciesArray(TomlArray? depsArray) |
| 98 | + { |
| 99 | + var deps = new List<UvDependency>(); |
| 100 | + if (depsArray is null) |
| 101 | + { |
119 | 102 | return deps; |
120 | 103 | } |
121 | 104 |
|
122 | | - internal static void ParseMetadata(TomlTable? metadataTable, UvPackage uvPackage) |
| 105 | + foreach (var dep in depsArray) |
123 | 106 | { |
124 | | - if (metadataTable is null) |
| 107 | + if (dep is TomlTable depTable && |
| 108 | + depTable.TryGetValue("name", out var depNameObj) && depNameObj is string depName) |
125 | 109 | { |
126 | | - return; |
| 110 | + var depSpec = depTable.TryGetValue("specifier", out var specObj) && specObj is string s ? s : null; |
| 111 | + deps.Add(new UvDependency |
| 112 | + { |
| 113 | + Name = depName, |
| 114 | + Specifier = depSpec, |
| 115 | + }); |
127 | 116 | } |
| 117 | + } |
128 | 118 |
|
129 | | - if (metadataTable.TryGetValue("requires-dist", out var requiresDistObj) && requiresDistObj is TomlArray requiresDistArr) |
130 | | - { |
131 | | - uvPackage.MetadataRequiresDist = ParseDependenciesArray(requiresDistArr); |
132 | | - } |
| 119 | + return deps; |
| 120 | + } |
133 | 121 |
|
134 | | - if (metadataTable.TryGetValue("requires-dev", out var requiresDevObj) && requiresDevObj is TomlTable requiresDevTable) |
| 122 | + internal static void ParseMetadata(TomlTable? metadataTable, UvPackage uvPackage) |
| 123 | + { |
| 124 | + if (metadataTable is null) |
| 125 | + { |
| 126 | + return; |
| 127 | + } |
| 128 | + |
| 129 | + if (metadataTable.TryGetValue("requires-dist", out var requiresDistObj) && requiresDistObj is TomlArray requiresDistArr) |
| 130 | + { |
| 131 | + uvPackage.MetadataRequiresDist = ParseDependenciesArray(requiresDistArr); |
| 132 | + } |
| 133 | + |
| 134 | + if (metadataTable.TryGetValue("requires-dev", out var requiresDevObj) && requiresDevObj is TomlTable requiresDevTable) |
| 135 | + { |
| 136 | + if (requiresDevTable.TryGetValue("dev", out var devObj) && devObj is TomlArray devArr) |
135 | 137 | { |
136 | | - if (requiresDevTable.TryGetValue("dev", out var devObj) && devObj is TomlArray devArr) |
137 | | - { |
138 | | - uvPackage.MetadataRequiresDev = ParseDependenciesArray(devArr); |
139 | | - } |
| 138 | + uvPackage.MetadataRequiresDev = ParseDependenciesArray(devArr); |
140 | 139 | } |
141 | 140 | } |
142 | 141 | } |
|
0 commit comments