This repository was archived by the owner on Sep 14, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPackageResolution.Pin.swift
67 lines (63 loc) · 2.04 KB
/
PackageResolution.Pin.swift
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
import SymbolGraphs
import Versions
import JSON
extension PackageResolution
{
public
struct Pin:Identifiable
{
public
struct State
{
let requirement:Requirement
let revision:String
public
init(_ requirement:Requirement, revision:String)
{
self.requirement = requirement
self.revision = revision
}
}
public
enum Requirement
{
case version(MaskedVersion)
case branch(String)
}
public
let id:PackageIdentifier
public
let state:State
let location:String?
public
init(from json:JSON) throws
{
(self.id, self.state, self.location) = try json.lint(whitelisting: ["kind"])
{
let id:ID = .init(
try $0.pop("identity", as: String.self) ??
$0.remove("package", as: String.self))
let location:String? = try $0.pop("location", as: String.self) ??
$0.pop("repositoryURL", as: String.self)
let state:State = try $0.remove("state")
{
try $0.lint(whitelisting: ["branch"])
{
let revision:String = try $0.remove("revision", as: String.self)
let requirement:Requirement
if let version:String = try $0.pop("version", as: String?.self)
{
requirement = .version(try .init(parsing: version))
}
else
{
requirement = .branch(try $0.remove("branch", as: String.self))
}
return .init(requirement, revision: revision)
}
}
return (id, state, location)
}
}
}
}