Skip to content

Commit 439f63e

Browse files
authored
Merge pull request #301 from tayloraswift/generalized-registrars
Generalized registrars
2 parents e31bd98 + 1bec723 commit 439f63e

File tree

48 files changed

+553
-431
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+553
-431
lines changed

Sources/UnidocRecords/Packages/Unidoc.EditionSelector.swift renamed to Sources/Symbols/Identifiers/Symbol.PackageAtRef.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
1-
import Symbols
2-
3-
extension Unidoc
1+
extension Symbol
42
{
53
@frozen public
6-
struct EditionSelector:Equatable, Hashable, Sendable
4+
struct PackageAtRef:Equatable, Hashable, Sendable
75
{
86
public
9-
var package:Symbol.Package
7+
var package:Package
108
public
119
var ref:Substring?
1210

1311
@inlinable public
14-
init(package:Symbol.Package, ref:Substring?)
12+
init(package:Package, ref:Substring?)
1513
{
1614
self.package = package
1715
self.ref = ref
1816
}
1917
}
2018
}
21-
extension Unidoc.EditionSelector:CustomStringConvertible
19+
extension Symbol.PackageAtRef:CustomStringConvertible
2220
{
2321
@inlinable public
2422
var description:String
2523
{
2624
self.ref.map { "\(self.package)/\($0)" } ?? "\(self.package)"
2725
}
2826
}
29-
extension Unidoc.EditionSelector:LosslessStringConvertible
27+
extension Symbol.PackageAtRef:LosslessStringConvertible
3028
{
3129
public
3230
init(_ trunk:String)

Sources/UnidocAPI/Building/Unidoc.BuildLabelsPrompt.swift

Lines changed: 0 additions & 84 deletions
This file was deleted.
Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,88 @@
1+
import SemanticVersions
2+
import Symbols
3+
import URI
4+
15
extension Unidoc
26
{
37
@frozen public
4-
enum BuildRequest:Equatable, Sendable
8+
struct BuildRequest<Package>
59
{
6-
case latest(VersionSeries, force:Bool)
7-
case id(Edition, force:Bool)
10+
public
11+
let version:BuildSelector<Package>
12+
public
13+
let rebuild:Bool
14+
15+
@inlinable public
16+
init(version:BuildSelector<Package>, rebuild:Bool)
17+
{
18+
self.version = version
19+
self.rebuild = rebuild
20+
}
21+
}
22+
}
23+
extension Unidoc.BuildRequest:Equatable where Package:Equatable
24+
{
25+
}
26+
extension Unidoc.BuildRequest:Sendable where Package:Sendable
27+
{
28+
}
29+
extension Unidoc.BuildRequest<Unidoc.Package>
30+
{
31+
public
32+
init?(query:borrowing URI.Query)
33+
{
34+
var package:Unidoc.Package? = nil
35+
var version:Unidoc.Version? = nil
36+
var series:Unidoc.VersionSeries? = nil
37+
var force:Bool = false
38+
39+
for (key, value) in query.parameters
40+
{
41+
switch key
42+
{
43+
case "package": package = .init(value)
44+
case "version": version = .init(value)
45+
case "series": series = .init(value)
46+
case "force": force = value == "true"
47+
default: continue
48+
}
49+
}
50+
51+
let selector:Unidoc.BuildSelector<Unidoc.Package>
52+
53+
if let package:Unidoc.Package,
54+
let version:Unidoc.Version
55+
{
56+
selector = .id(.init(package: package, version: version))
57+
}
58+
else if
59+
let package:Unidoc.Package,
60+
let series:Unidoc.VersionSeries
61+
{
62+
selector = .latest(series, of: package)
63+
}
64+
else
65+
{
66+
return nil
67+
}
68+
69+
self.init(version: selector, rebuild: force)
70+
}
71+
72+
public
73+
var query:URI.Query
74+
{
75+
switch self.version
76+
{
77+
case .id(let edition):
78+
[
79+
"package": "\(edition.package)",
80+
"version": "\(edition.version)",
81+
"force": "\(self.rebuild)"
82+
]
83+
84+
case .latest(let series, of: let package):
85+
["package": "\(package)", "series": "\(series)", "force": "\(self.rebuild)"]
86+
}
887
}
988
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
extension Unidoc
2+
{
3+
@frozen public
4+
enum BuildSelector<Package>
5+
{
6+
/// Build a specific edition of a package.
7+
case id(Edition)
8+
/// Build the latest version of a package.
9+
case latest(VersionSeries, of:Package)
10+
}
11+
}
12+
extension Unidoc.BuildSelector<Void>
13+
{
14+
@inlinable public
15+
static func latest(_ series:Unidoc.VersionSeries) -> Self
16+
{
17+
.latest(series, of: ())
18+
}
19+
}
20+
extension Unidoc.BuildSelector
21+
{
22+
@inlinable public
23+
var exact:Unidoc.Edition?
24+
{
25+
switch self
26+
{
27+
case .id(let id): id
28+
case .latest: nil
29+
}
30+
}
31+
}
32+
extension Unidoc.BuildSelector:Equatable where Package:Equatable
33+
{
34+
}
35+
extension Unidoc.BuildSelector:Sendable where Package:Sendable
36+
{
37+
}

Sources/UnidocAPI/Building/Unidoc.BuildStatus.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ extension Unidoc
66
struct BuildStatus
77
{
88
public
9-
let request:Unidoc.BuildRequest?
9+
let request:Unidoc.BuildRequest<Void>?
1010
public
1111
let stage:Unidoc.BuildStage?
1212
public
1313
let failure:Unidoc.BuildFailure?
1414

1515
@inlinable public
16-
init(request:Unidoc.BuildRequest?,
16+
init(request:Unidoc.BuildRequest<Void>?,
1717
stage:Unidoc.BuildStage?,
1818
failure:Unidoc.BuildFailure?)
1919
{
@@ -40,18 +40,18 @@ extension Unidoc.BuildStatus:JSONObjectEncodable
4040
public
4141
func encode(to json:inout JSON.ObjectEncoder<CodingKey>)
4242
{
43-
switch self.request
43+
if let request:Unidoc.BuildRequest<Void> = self.request
4444
{
45-
case nil:
46-
break
45+
switch request.version
46+
{
47+
case .latest(let series, of: ()):
48+
json[.series] = series
4749

48-
case .latest(let series, force: let force):
49-
json[.series] = series
50-
json[.force] = force
50+
case .id(let id):
51+
json[.version] = id
52+
}
5153

52-
case .id(let id, force: let force):
53-
json[.version] = id
54-
json[.force] = force
54+
json[.force] = request.rebuild
5555
}
5656

5757
json[.stage] = self.stage
@@ -63,15 +63,15 @@ extension Unidoc.BuildStatus:JSONObjectDecodable
6363
public
6464
init(json:JSON.ObjectDecoder<CodingKey>) throws
6565
{
66-
let request:Unidoc.BuildRequest?
66+
let request:Unidoc.BuildRequest<Void>?
6767
if let series:Unidoc.VersionSeries = try json[.series]?.decode()
6868
{
69-
request = .latest(series, force: try json[.force].decode())
69+
request = .init(version: .latest(series), rebuild: try json[.force].decode())
7070
}
7171
else if
7272
let id:Unidoc.Edition = try json[.version]?.decode()
7373
{
74-
request = .id(id, force: try json[.force].decode())
74+
request = .init(version: .id(id), rebuild: try json[.force].decode())
7575
}
7676
else
7777
{

Sources/UnidocAPI/Building/Unidoc.EditionStateReport.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ extension Unidoc.EditionStateReport
7575
}
7676
else
7777
{
78-
switch build.request
78+
switch build.request?.version
7979
{
8080
case .latest?:
8181
return .QUEUED_FLOATING_VERSION
8282

83-
case .id(self.id, force: _)?:
83+
case .id(self.id)?:
8484
return .QUEUED
8585

8686
case .id?:

Sources/UnidocClient/Unidoc.Client.Connection.swift

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -50,33 +50,9 @@ extension Unidoc.Client<HTTP.Client2>.Connection
5050
{
5151
do
5252
{
53-
let prompt:Unidoc.BuildLabelsPrompt = .edition(id, force: true)
54-
return try await self.get(from: "/builder\(prompt.query)", timeout: .seconds(10))
55-
}
56-
catch let error as HTTP.StatusError
57-
{
58-
guard
59-
case 404? = error.code
60-
else
61-
{
62-
throw error
63-
}
64-
65-
return nil
66-
}
67-
}
68-
69-
public
70-
func labels(of package:Symbol.Package,
71-
series:Unidoc.VersionSeries) async throws -> Unidoc.BuildLabels?
72-
{
73-
do
74-
{
75-
let prompt:Unidoc.BuildLabelsPrompt = .packageNamed(package,
76-
series: series,
77-
force: true)
78-
79-
return try await self.get(from: "/builder\(prompt.query)", timeout: .seconds(10))
53+
let request:Unidoc.BuildRequest<Unidoc.Package> = .init(version: .id(id),
54+
rebuild: true)
55+
return try await self.get(from: "/builder\(request.query)", timeout: .seconds(10))
8056
}
8157
catch let error as HTTP.StatusError
8258
{

Sources/UnidocDB/Building/Unidoc.BuildSelector.swift renamed to Sources/UnidocDB/Building/Unidoc.BuildBehavior.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import UnidocAPI
44
extension Unidoc
55
{
66
@frozen public
7-
enum BuildSelector:Equatable, Sendable
7+
enum BuildBehavior:Equatable, Sendable
88
{
99
case latest(VersionSeries, force:Bool)
1010
case id(force:Bool)
1111
}
1212
}
13-
extension Unidoc.BuildSelector:RawRepresentable
13+
extension Unidoc.BuildBehavior:RawRepresentable
1414
{
1515
@inlinable public
1616
init?(rawValue:Int32)
@@ -41,6 +41,6 @@ extension Unidoc.BuildSelector:RawRepresentable
4141
}
4242
}
4343
}
44-
extension Unidoc.BuildSelector:BSONDecodable, BSONEncodable
44+
extension Unidoc.BuildBehavior:BSONDecodable, BSONEncodable
4545
{
4646
}

0 commit comments

Comments
 (0)