Skip to content

Commit 230232a

Browse files
committed
first attempt at exposing conforming types in the UI
1 parent a9ae113 commit 230232a

21 files changed

+357
-83
lines changed

Sources/Swiftinit/Swiftinit.Root.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ extension Swiftinit
1515
case login
1616
case lunr
1717
case plugin
18+
case ptcl
19+
case pdct
1820
case realm
1921
case stats
2022
case tags
@@ -55,6 +57,8 @@ extension Swiftinit.Root:Identifiable
5557
case .login: "login"
5658
case .lunr: "lunr"
5759
case .plugin: "plugin"
60+
case .ptcl: "ptcl"
61+
case .pdct: "pdct"
5862
case .realm: "realm"
5963
case .stats: "stats"
6064
case .tags: "tags"

Sources/SwiftinitPages/Sections/ExtensionHeading.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,19 @@ struct ExtensionHeading
1010
let display:String
1111
private
1212
let culture:Unidoc.Scalar
13+
1314
private
14-
let `where`:[GenericConstraint<Unidoc.Scalar?>]
15+
let constraints:[GenericConstraint<Unidoc.Scalar?>]
1516

1617
init(_ context:IdentifiablePageContext<Unidoc.Scalar>,
1718
display:String,
1819
culture:Unidoc.Scalar,
19-
where:[GenericConstraint<Unidoc.Scalar?>])
20+
where constraints:[GenericConstraint<Unidoc.Scalar?>])
2021
{
2122
self.context = context
2223
self.display = display
2324
self.culture = culture
24-
self.where = `where`
25+
self.constraints = constraints
2526
}
2627
}
2728
extension ExtensionHeading:HTML.OutputStreamable
@@ -35,6 +36,6 @@ extension ExtensionHeading:HTML.OutputStreamable
3536
$0 ?= self.context.link(module: self.culture)
3637
}
3738

38-
html[.code] { $0.class = "constraints" } = self.context.constraints(self.where)
39+
html[.code] { $0.class = "constraints" } = self.context.constraints(self.constraints)
3940
}
4041
}

Sources/SwiftinitPages/Sections/GroupSections.swift

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@ struct GroupSections
1515
private
1616
let superforms:[Unidoc.Scalar]?
1717

18-
private(set)
19-
var containing:Unidoc.ExtensionGroup?
18+
private
19+
var conformers:[Unidoc.ConformerGroup]
2020
private
2121
var extensions:[Unidoc.ExtensionGroup]
2222
private
2323
var topics:[Unidoc.TopicGroup]
2424
private
2525
var other:[(AutomaticHeading, [Unidoc.Scalar])]
2626

27+
private(set)
28+
var peers:Unidoc.ExtensionGroup?
29+
2730
private
2831
let bias:Unidoc.Scalar?
2932
private
@@ -33,22 +36,23 @@ struct GroupSections
3336
init(_ context:IdentifiablePageContext<Unidoc.Scalar>,
3437
requirements:[Unidoc.Scalar]?,
3538
superforms:[Unidoc.Scalar]?,
36-
containing:Unidoc.ExtensionGroup? = nil,
39+
conformers:[Unidoc.ConformerGroup] = [],
3740
extensions:[Unidoc.ExtensionGroup] = [],
3841
topics:[Unidoc.TopicGroup] = [],
3942
other:[(AutomaticHeading, [Unidoc.Scalar])] = [],
43+
peers:Unidoc.ExtensionGroup? = nil,
4044
bias:Unidoc.Scalar?,
4145
mode:Mode?)
4246
{
4347
self.context = context
4448

4549
self.requirements = requirements
4650
self.superforms = superforms
47-
48-
self.containing = containing
51+
self.conformers = conformers
4952
self.extensions = extensions
5053
self.topics = topics
5154
self.other = other
55+
self.peers = peers
5256
self.bias = bias
5357
self.mode = mode
5458
}
@@ -93,14 +97,13 @@ extension GroupSections
9397
{
9498
switch group
9599
{
96-
case .conformers:
97-
// Unimplemented.
98-
continue
100+
case .conformer(let group):
101+
self.conformers.append(group)
99102

100103
case .extension(let group):
101104
if case group.id? = container
102105
{
103-
self.containing = group
106+
self.peers = group
104107
continue
105108
}
106109

@@ -174,43 +177,53 @@ extension GroupSections
174177
($1.1, $1.0.culture.citizen, $1.2, $1.0.id)
175178
}
176179

177-
self.containing = self.containing.map { $0.subtracting(curated) }
180+
// No need to filter the conformers, as it should never appear alongside any custom
181+
// curated groups.
182+
self.peers = self.peers.map { $0.subtracting(curated) }
178183
self.extensions = extensions.map { $0.0.subtracting(curated) }
179184

185+
self.conformers.sort { $0.id < $1.id }
180186
self.topics.sort { $0.id < $1.id }
181187
self.other.sort { $0.0 < $1.0 }
182188
}
183189
}
184190
extension GroupSections
185191
{
186192
private
187-
func heading(for extension:Unidoc.ExtensionGroup) -> ExtensionHeading
193+
func heading(culture:Unidoc.Scalar,
194+
constraints:[GenericConstraint<Unidoc.Scalar?>] = []) -> ExtensionHeading
188195
{
189196
let display:String
190197
switch (self.bias, self.bias?.edition)
191198
{
192-
case (`extension`.culture?, _): display = "Citizens in "
193-
case (_, `extension`.id.edition?): display = "Available in "
194-
case (_, _): display = "Extension in "
199+
case (culture?, _): display = "Citizens in "
200+
case (_, culture.edition?): display = "Available in "
201+
case (_, _): display = "Extension in "
195202
}
196203

197-
return .init(self.context,
198-
display: display,
199-
culture: `extension`.culture,
200-
where: `extension`.constraints)
204+
return .init(self.context, display: display, culture: culture, where: constraints)
205+
}
206+
private
207+
func heading(for group:Unidoc.ConformerGroup) -> ExtensionHeading
208+
{
209+
self.heading(culture: group.culture)
210+
}
211+
private
212+
func heading(for group:Unidoc.ExtensionGroup) -> ExtensionHeading
213+
{
214+
self.heading(culture: group.culture, constraints: group.constraints)
215+
}
216+
217+
private
218+
func list(_ types:__owned [Unidoc.ConformingType]) -> Swiftinit.DenseList?
219+
{
220+
types.isEmpty ? nil : .init(self.context, members: types)
201221
}
202222

203223
private
204224
func list(_ scalars:__owned [Unidoc.Scalar], under heading:String? = nil) -> GroupList?
205225
{
206-
if scalars.isEmpty
207-
{
208-
nil
209-
}
210-
else
211-
{
212-
.init(self.context, heading: heading, scalars: scalars)
213-
}
226+
scalars.isEmpty ? nil : .init(self.context, heading: heading, scalars: scalars)
214227
}
215228
}
216229

@@ -351,12 +364,12 @@ extension GroupSections:HTML.OutputStreamable
351364
}
352365
}
353366

354-
if let sisters:Unidoc.ExtensionGroup = self.containing, !sisters.nested.isEmpty
367+
if let peers:Unidoc.ExtensionGroup = self.peers, !peers.nested.isEmpty
355368
{
356369
html[.section, { $0.class = "group sisters" }]
357370
{
358371
AutomaticHeading.otherMembers.window(&$0,
359-
listing: sisters.nested,
372+
listing: peers.nested,
360373
limit: 12,
361374
open: self.extensions.allSatisfy(\.isEmpty))
362375
{
@@ -365,6 +378,17 @@ extension GroupSections:HTML.OutputStreamable
365378
}
366379
}
367380

381+
for group:Unidoc.ConformerGroup in self.conformers
382+
{
383+
html[.section, { $0.class = "group conformer" }]
384+
{
385+
$0 += self.heading(for: group)
386+
387+
$0[.ul] = self.list(group.unconditional.map { .init(id: $0, where: []) }
388+
+ group.conditional)
389+
}
390+
}
391+
368392
for group:Unidoc.ExtensionGroup in self.extensions where !group.isEmpty
369393
{
370394
html[.section, { $0.class = "group extension" }]
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import HTML
2+
import Unidoc
3+
4+
extension Swiftinit
5+
{
6+
struct DenseList
7+
{
8+
let context:IdentifiablePageContext<Unidoc.Scalar>
9+
10+
let members:[Unidoc.ConformingType]
11+
12+
init(_ context:IdentifiablePageContext<Unidoc.Scalar>, members:[Unidoc.ConformingType])
13+
{
14+
self.context = context
15+
self.members = members
16+
}
17+
}
18+
}
19+
extension Swiftinit.DenseList:HTML.OutputStreamable
20+
{
21+
static
22+
func += (ul:inout HTML.ContentEncoder, self:Self)
23+
{
24+
for type:Unidoc.ConformingType in self.members
25+
{
26+
ul[.li]
27+
{
28+
$0[.p] = self.context.link(decl: type.id)
29+
$0[.p]
30+
{
31+
$0 += "Available"
32+
$0[.code]
33+
{
34+
$0.class = "constraints"
35+
} = self.context.constraints(type.constraints)
36+
}
37+
}
38+
}
39+
}
40+
}

Sources/SwiftinitPages/Surfaces/Swiftinit.VertexLayer.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ extension Swiftinit.VertexLayer
4040
}
4141
}
4242

43-
static
44-
subscript(volume:Unidoc.VolumeMetadata) -> URI
45-
{
46-
Self[volume.selector, cdecl: false]
47-
}
48-
4943
static
5044
subscript(volume:Unidoc.VolumeMetadata, route:Unidoc.Route) -> URI
5145
{
@@ -56,4 +50,10 @@ extension Swiftinit.VertexLayer
5650

5751
return uri
5852
}
53+
54+
static
55+
subscript(volume:Unidoc.VolumeMetadata) -> URI
56+
{
57+
Self[volume.selector, cdecl: false]
58+
}
5959
}

Sources/SwiftinitPages/Surfaces/Vertices/Swiftinit.BlogEndpoint.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ extension Swiftinit.BlogEndpoint:Swiftinit.VertexEndpoint, HTTP.ServerEndpoint
3232
tree:consuming Unidoc.TypeTree?,
3333
with context:IdentifiableResponseContext) throws -> HTTP.ServerResponse
3434
{
35-
if case .article(let vertex) = vertex
35+
switch vertex
3636
{
37+
case .article(let vertex):
3738
let page:Swiftinit.Blog.ArticlePage = .init(context.page, vertex: vertex)
3839
return .ok(page.resource(format: context.format))
39-
}
40-
else
41-
{
42-
return .error("not an article!")
40+
41+
case let unexpected:
42+
throw Unidoc.VertexTypeError.reject(unexpected)
4343
}
4444
}
4545
}

Sources/SwiftinitPages/Surfaces/Vertices/Swiftinit.Docs.DeclPage.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,8 @@ extension Swiftinit.Docs.DeclPage:Swiftinit.VertexPage
235235
}
236236
}
237237

238-
if let containing:Unidoc.ExtensionGroup = self.groups.containing,
239-
let list:ConstraintsList = self.context.constraints(containing.constraints)
238+
if let peers:Unidoc.ExtensionGroup = self.groups.peers,
239+
let list:ConstraintsList = self.context.constraints(peers.constraints)
240240
{
241241
$0[.details, { $0.open = true }]
242242
{

Sources/SwiftinitPages/Surfaces/Vertices/Swiftinit.DocsEndpoint.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import HTTP
2-
import Media
32
import MongoDB
43
import UnidocDB
54
import UnidocQueries
65
import UnidocRecords
7-
import URI
86

97
extension Swiftinit
108
{

0 commit comments

Comments
 (0)