diff --git a/Snippets/ExampleAccumulators.swift b/Snippets/ExampleAccumulators.swift index 207d16a8..af66bcab 100644 --- a/Snippets/ExampleAccumulators.swift +++ b/Snippets/ExampleAccumulators.swift @@ -8,7 +8,7 @@ func ExampleAccumulators() $0[.top] = .init { $0[.output] = "$field" - $0[.by] = .init + $0[.by, using: Mongo.AnyKeyPath.self] { $0["x"] = (+) $0["y"] = (-) @@ -20,8 +20,8 @@ func ExampleAccumulators() $0[.top] = .init { $0[.output] = "$field" - $0[.count] = 5 - $0[.by] = .init + $0[.n] = 5 + $0[.by, using: Mongo.AnyKeyPath.self] { $0["x"] = (+) $0["y"] = (-) @@ -33,7 +33,7 @@ func ExampleAccumulators() $0[.first] = .init { $0[.input] = "$field" - $0[.count] = 5 + $0[.n] = 5 } } let _:Mongo.Accumulator = .init diff --git a/Snippets/ExampleExpressions.swift b/Snippets/ExampleExpressions.swift index 4ccf0756..d0fe7563 100644 --- a/Snippets/ExampleExpressions.swift +++ b/Snippets/ExampleExpressions.swift @@ -368,7 +368,7 @@ func ExampleExpressions() $0[.sortArray] = .init { $0[.input] = "$field" - $0[.by] = .init + $0[.by, using: Mongo.AnyKeyPath.self] { $0["x"] = (+) $0["y"] = (-) diff --git a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.N.swift b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.N.swift new file mode 100644 index 00000000..df507aa5 --- /dev/null +++ b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.N.swift @@ -0,0 +1,8 @@ +extension Mongo.Accumulator +{ + @frozen public + enum N:String, Sendable + { + case n + } +} diff --git a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeDocument.swift b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeDocument.swift index 37db11ef..05fff089 100644 --- a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeDocument.swift +++ b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeDocument.swift @@ -17,8 +17,14 @@ extension Mongo.Accumulator } extension Mongo.Accumulator.SuperlativeDocument { + @frozen public + enum Input:String, Sendable + { + case input + } + @inlinable public - subscript(key:Mongo.SortDocument.Input) -> Encodable? + subscript(key:Input) -> Encodable? where Encodable:BSONEncodable { get @@ -30,8 +36,11 @@ extension Mongo.Accumulator.SuperlativeDocument value?.encode(to: &self.bson[with: key]) } } +} +extension Mongo.Accumulator.SuperlativeDocument +{ @inlinable public - subscript(key:Mongo.SortDocument.Count) -> Encodable? + subscript(key:Mongo.Accumulator.N) -> Encodable? where Encodable:BSONEncodable { get diff --git a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeSortDocument.swift b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeSortDocument.swift index fd34dca4..50492e1f 100644 --- a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeSortDocument.swift +++ b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.SuperlativeSortDocument.swift @@ -17,36 +17,48 @@ extension Mongo.Accumulator } extension Mongo.Accumulator.SuperlativeSortDocument { + @available(*, unavailable) @inlinable public - subscript(key:Mongo.SortDocument.By) -> Mongo.SortDocument? + subscript(key:Mongo.SortBy) -> Mongo.SortDocument? { - get - { - nil - } - set(value) + nil + } + + @inlinable public + subscript(key:Mongo.SortBy, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void + { + mutating get { - value?.encode(to: &self.bson[with: key]) + yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) } } +} +extension Mongo.Accumulator.SuperlativeSortDocument +{ + @frozen public + enum Output:String, Hashable, Sendable + { + case output + } + @inlinable public - subscript(key:Mongo.SortDocument.Output) -> Encodable? + subscript(key:Output) -> Encodable? where Encodable:BSONEncodable { - get - { - nil - } - set(value) + get { nil } + set (value) { value?.encode(to: &self.bson[with: key]) } } } -extension Mongo.Accumulator.SuperlativeSortDocument +extension Mongo.Accumulator.SuperlativeSortDocument { + @inlinable public - subscript(key:Mongo.SortDocument.Count) -> Encodable? + subscript(key:Mongo.Accumulator.N) -> Encodable? where Encodable:BSONEncodable { get diff --git a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.swift b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.swift index 27063948..b289bbd5 100644 --- a/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.swift +++ b/Sources/MongoBuiltins/Accumulators/Mongo.Accumulator.swift @@ -81,7 +81,7 @@ extension Mongo.Accumulator } @_disfavoredOverload @inlinable public - subscript(key:SuperlativeSort) -> SuperlativeSortDocument? + subscript(key:SuperlativeSort) -> SuperlativeSortDocument? { get { diff --git a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.By.swift b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortBy.swift similarity index 63% rename from Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.By.swift rename to Sources/MongoBuiltins/Documents/Sort/Mongo.SortBy.swift index 9f7b623e..dbff78e5 100644 --- a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.By.swift +++ b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortBy.swift @@ -1,12 +1,12 @@ -extension Mongo.SortDocument +extension Mongo { @frozen public - enum By:String, Hashable, Sendable + enum SortBy:String, Hashable, Sendable { case by = "sortBy" } } -extension Mongo.SortDocument.By +extension Mongo.SortBy { @available(*, unavailable, renamed: "by") public static diff --git a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Count.swift b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Count.swift deleted file mode 100644 index f42495cd..00000000 --- a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Count.swift +++ /dev/null @@ -1,17 +0,0 @@ -extension Mongo.SortDocument -{ - @frozen public - enum Count:String, Hashable, Sendable - { - case count = "n" - } -} -extension Mongo.SortDocument.Count -{ - @available(*, unavailable, renamed: "count") - public static - var n:Self - { - .count - } -} diff --git a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Input.swift b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Input.swift deleted file mode 100644 index 1c59cdd7..00000000 --- a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Input.swift +++ /dev/null @@ -1,8 +0,0 @@ -extension Mongo.SortDocument -{ - @frozen public - enum Input:String, Hashable, Sendable - { - case input - } -} diff --git a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Output.swift b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Output.swift deleted file mode 100644 index 18a3dc28..00000000 --- a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.Output.swift +++ /dev/null @@ -1,8 +0,0 @@ -extension Mongo.SortDocument -{ - @frozen public - enum Output:String, Hashable, Sendable - { - case output - } -} diff --git a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.swift b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.swift index 4634b644..44bb6801 100644 --- a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.swift +++ b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortDocument.swift @@ -4,7 +4,7 @@ import MongoABI extension Mongo { @frozen public - struct SortDocument:Sendable + struct SortDocument:Sendable where CodingKey:RawRepresentable { public var bson:BSON.Document @@ -19,5 +19,5 @@ extension Mongo extension Mongo.SortDocument:Mongo.EncodableDocument { public - typealias Encoder = Mongo.SortEncoder + typealias Encoder = Mongo.SortEncoder } diff --git a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortEncoder.swift b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortEncoder.swift index d8bab8f9..0fed0106 100644 --- a/Sources/MongoBuiltins/Documents/Sort/Mongo.SortEncoder.swift +++ b/Sources/MongoBuiltins/Documents/Sort/Mongo.SortEncoder.swift @@ -4,13 +4,13 @@ import MongoABI extension Mongo { @frozen public - struct SortEncoder:Sendable + struct SortEncoder:Sendable where CodingKey:RawRepresentable { @usableFromInline - var bson:BSON.DocumentEncoder + var bson:BSON.DocumentEncoder @inlinable internal - init(bson:BSON.DocumentEncoder) + init(bson:BSON.DocumentEncoder) { self.bson = bson } @@ -36,7 +36,7 @@ extension Mongo.SortEncoder pass the `(+)` or `(-)` operator functions to specify sort direction. """) @inlinable public - subscript(path:Mongo.AnyKeyPath) -> Int? + subscript(path:CodingKey) -> Int? { get { nil } set { } @@ -67,7 +67,7 @@ extension Mongo.SortEncoder extension Mongo.SortEncoder { @inlinable public - subscript(path:Mongo.AnyKeyPath) -> ((Direction) -> Never)? + subscript(path:CodingKey) -> ((Direction) -> Never)? where Direction:Mongo.SortDirection { get { nil } @@ -75,7 +75,7 @@ extension Mongo.SortEncoder { if case _? = value { - Direction.code.encode(to: &self.bson[with: path.stem]) + Direction.code.encode(to: &self.bson[with: path]) } } } @@ -83,11 +83,11 @@ extension Mongo.SortEncoder extension Mongo.SortEncoder { @inlinable public - subscript(path:Mongo.AnyKeyPath, yield:(inout Mongo.SortOperatorEncoder) -> ()) -> Void + subscript(path:CodingKey, yield:(inout Mongo.SortOperatorEncoder) -> ()) -> Void { mutating get { - yield(&self.bson[with: path.stem][as: Mongo.SortOperatorEncoder.self]) + yield(&self.bson[with: path][as: Mongo.SortOperatorEncoder.self]) } } } diff --git a/Sources/MongoBuiltins/Documents/SortArray/Mongo.SortArrayDocument.swift b/Sources/MongoBuiltins/Documents/SortArray/Mongo.SortArrayDocument.swift index 90df8f3e..b09cde87 100644 --- a/Sources/MongoBuiltins/Documents/SortArray/Mongo.SortArrayDocument.swift +++ b/Sources/MongoBuiltins/Documents/SortArray/Mongo.SortArrayDocument.swift @@ -1,4 +1,5 @@ import BSON +import MongoABI extension Mongo { @@ -17,8 +18,14 @@ extension Mongo } extension Mongo.SortArrayDocument { + @frozen public + enum Input:String, Sendable + { + case input + } + @inlinable public - subscript(key:Mongo.SortDocument.Input) -> Encodable? + subscript(key:Input) -> Encodable? where Encodable:BSONEncodable { get @@ -30,16 +37,22 @@ extension Mongo.SortArrayDocument value?.encode(to: &self.bson[with: key]) } } + @inlinable public - subscript(key:Mongo.SortDocument.By) -> Mongo.SortDocument? + subscript(key:Mongo.SortBy, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { - get + mutating get { - nil - } - set(value) - { - value?.encode(to: &self.bson[with: key]) + yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) } } + + @available(*, unavailable) + @inlinable public + subscript(key:Mongo.SortBy) -> Mongo.SortDocument? + { + nil + } } diff --git a/Sources/MongoBuiltins/Documents/Update/Mongo.UpdateArrayEncoder.swift b/Sources/MongoBuiltins/Documents/Update/Mongo.UpdateArrayEncoder.swift index 61a0d994..0c28d7e2 100644 --- a/Sources/MongoBuiltins/Documents/Update/Mongo.UpdateArrayEncoder.swift +++ b/Sources/MongoBuiltins/Documents/Update/Mongo.UpdateArrayEncoder.swift @@ -82,11 +82,13 @@ extension Mongo.UpdateArrayEncoder } @inlinable public - subscript(key:Sort, yield:(inout Mongo.SortEncoder) -> ()) -> Void + subscript(key:Sort, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get { - yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) + yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) } } } diff --git a/Sources/MongoBuiltins/Pipelines/Mongo.PipelineEncoder.swift b/Sources/MongoBuiltins/Pipelines/Mongo.PipelineEncoder.swift index 412b7705..9788b978 100644 --- a/Sources/MongoBuiltins/Pipelines/Mongo.PipelineEncoder.swift +++ b/Sources/MongoBuiltins/Pipelines/Mongo.PipelineEncoder.swift @@ -712,24 +712,25 @@ extension Mongo.PipelineEncoder extension Mongo.PipelineEncoder { @inlinable public - subscript(stage key:Mongo.Pipeline.Sort) -> Mongo.SortDocument? + subscript(stage sort:Mongo.Pipeline.Sort, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { - get { nil } - set (value) + mutating get { - guard - let value:Mongo.SortDocument - else - { - return - } - self.list(Mongo.Pipeline.Sort.self) { - $0[.sort] = value + yield(&$0[with: sort][as: Mongo.SortEncoder.self]) } } } + + @available(*, unavailable) + @inlinable public + subscript(stage key:Mongo.Pipeline.Sort) -> Mongo.SortDocument? + { + nil + } } extension Mongo.PipelineEncoder diff --git a/Sources/MongoDBTests/CausalConsistency/CausalConsistency.swift b/Sources/MongoDBTests/CausalConsistency/CausalConsistency.swift index 9b2e2ad2..7c2bf32d 100644 --- a/Sources/MongoDBTests/CausalConsistency/CausalConsistency.swift +++ b/Sources/MongoDBTests/CausalConsistency/CausalConsistency.swift @@ -174,9 +174,9 @@ struct CausalConsistency:MongoTestBattery command: Mongo.Find>.init(collection, limit: 10) { - $0[.sort] + $0[.sort, using: Letter.CodingKey.self] { - $0["_id"] = (+) + $0[.id] = (+) } }, against: database, @@ -214,9 +214,9 @@ struct CausalConsistency:MongoTestBattery command: Mongo.Find>.init(collection, limit: 10) { - $0[.sort] + $0[.sort, using: Letter.CodingKey.self] { - $0["_id"] = (+) + $0[.id] = (+) } }, against: database, diff --git a/Sources/MongoDBTests/Delete/Delete.swift b/Sources/MongoDBTests/Delete/Delete.swift index 98606908..c3a5c75a 100644 --- a/Sources/MongoDBTests/Delete/Delete.swift +++ b/Sources/MongoDBTests/Delete/Delete.swift @@ -134,9 +134,9 @@ struct Delete:MongoTestBattery where Configuration:MongoTestConfi .init { $0[.name] = "points_index" - $0[.key] = .init + $0[.key, using: Cake.CodingKey.self] { - $0["points"] = (+) + $0[.points] = (+) } }, ]), diff --git a/Sources/MongoDBTests/Find/Find.swift b/Sources/MongoDBTests/Find/Find.swift index 4e4d0c6f..d4c55d25 100644 --- a/Sources/MongoDBTests/Find/Find.swift +++ b/Sources/MongoDBTests/Find/Find.swift @@ -56,9 +56,9 @@ struct Find:MongoTestBattery where Configuration:MongoTestConfigu limit: 5, skip: 10) { - $0[.hint] + $0[.hint, using: Record.CodingKey.self] { - $0["_id"] = (+) + $0[.id] = (+) } }, against: database) @@ -75,9 +75,9 @@ struct Find:MongoTestBattery where Configuration:MongoTestConfigu limit: 5, skip: 10) { - $0[.sort] + $0[.sort, using: Record.CodingKey.self] { - $0["value"] = (-) + $0[.value] = (-) } }, against: database) diff --git a/Sources/MongoDBTests/FindAndModify/FindAndModify.swift b/Sources/MongoDBTests/FindAndModify/FindAndModify.swift index a98ec324..1769a2de 100644 --- a/Sources/MongoDBTests/FindAndModify/FindAndModify.swift +++ b/Sources/MongoDBTests/FindAndModify/FindAndModify.swift @@ -186,9 +186,9 @@ struct FindAndModify:MongoTestBattery where Configuration:MongoTe writeConcern: .majority, returning: .deleted) { - $0[.sort] + $0[.sort, using: Ruler.CodingKey.self] { - $0["since"] = (+) + $0[.since] = (+) } }, against: database) diff --git a/Sources/MongoDBTests/Indexes/Indexes.swift b/Sources/MongoDBTests/Indexes/Indexes.swift index 522c6f3f..6fdc2040 100644 --- a/Sources/MongoDBTests/Indexes/Indexes.swift +++ b/Sources/MongoDBTests/Indexes/Indexes.swift @@ -61,22 +61,22 @@ struct Indexes:MongoTestBattery where Configuration:MongoTestConf { $0[.unique] = true $0[.name] = "item_manufacturer_model" - $0[.key] = .init + $0[.key, using: Product.CodingKey.self] { - $0["item"] = (+) - $0["manufacturer"] = (+) - $0["model"] = (+) + $0[.item] = (+) + $0[.manufacturer] = (+) + $0[.model] = (+) } }, .init { $0[.unique] = true $0[.name] = "item_supplier_model" - $0[.key] = .init + $0[.key, using: Product.CodingKey.self] { - $0["item"] = (+) - $0["supplier"] = (+) - $0["model"] = (+) + $0[.item] = (+) + $0[.supplier] = (+) + $0[.model] = (+) } }, ]), @@ -102,11 +102,11 @@ struct Indexes:MongoTestBattery where Configuration:MongoTestConf { $0[.unique] = true $0[.name] = "item_supplier_model" - $0[.key] = .init + $0[.key, using: Product.CodingKey.self] { - $0["item"] = (+) - $0["supplier"] = (+) - $0["model"] = (+) + $0[.item] = (+) + $0[.supplier] = (+) + $0[.model] = (+) } }, ]), diff --git a/Sources/MongoDBTests/Letter.swift b/Sources/MongoDBTests/Letter.swift index 140f4e4d..efe59705 100644 --- a/Sources/MongoDBTests/Letter.swift +++ b/Sources/MongoDBTests/Letter.swift @@ -1,4 +1,5 @@ import BSON +import MongoQL struct Letter:Hashable, Sendable { @@ -11,7 +12,7 @@ extension Letter:ExpressibleByUnicodeScalarLiteral self.init(id: unicodeScalarLiteral) } } -extension Letter +extension Letter:Mongo.MasterCodingModel { enum CodingKey:String, Sendable { diff --git a/Sources/MongoQL/Commands/Aggregate/Mongo.Aggregate.swift b/Sources/MongoQL/Commands/Aggregate/Mongo.Aggregate.swift index 81cfcdc0..99df3bbf 100644 --- a/Sources/MongoQL/Commands/Aggregate/Mongo.Aggregate.swift +++ b/Sources/MongoQL/Commands/Aggregate/Mongo.Aggregate.swift @@ -182,10 +182,10 @@ extension Mongo.Aggregate } } } -extension Mongo.Aggregate +extension Mongo.Aggregate:Mongo.HintableEncoder { @frozen public - enum Hint:String, Hashable, Sendable + enum Hint:String, Sendable { case hint } @@ -193,22 +193,18 @@ extension Mongo.Aggregate @inlinable public subscript(key:Hint) -> String? { - get - { - nil - } - set(value) - { - value?.encode(to: &self.fields[with: key]) - } + get { nil } + set (value) { value?.encode(to: &self.fields[with: key]) } } @inlinable public - subscript(key:Hint, yield:(inout Mongo.SortEncoder) -> ()) -> Void + subscript(key:Hint, + using _:IndexKey.Type = IndexKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get { - yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) + yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) } } } diff --git a/Sources/MongoQL/Commands/CreateIndexes/Mongo.CreateIndexStatementEncoder.swift b/Sources/MongoQL/Commands/CreateIndexes/Mongo.CreateIndexStatementEncoder.swift index 7cae2908..6343503e 100644 --- a/Sources/MongoQL/Commands/CreateIndexes/Mongo.CreateIndexStatementEncoder.swift +++ b/Sources/MongoQL/Commands/CreateIndexes/Mongo.CreateIndexStatementEncoder.swift @@ -74,8 +74,11 @@ extension Mongo.CreateIndexStatementEncoder } } } -extension Mongo.CreateIndexStatementEncoder +extension Mongo.CreateIndexStatementEncoder:Mongo.SortableEncoder { + public + typealias Sort = Key + @frozen public enum Key:String, Hashable, Sendable { @@ -83,15 +86,13 @@ extension Mongo.CreateIndexStatementEncoder } @inlinable public - subscript(key:Key) -> Mongo.SortDocument? + subscript(key:Key, + using _:IndexKey.Type = IndexKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { - get - { - nil - } - set(value) + mutating get { - value?.encode(to: &self.bson[with: key]) + yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) } } } diff --git a/Sources/MongoQL/Commands/Delete/Mongo.DeleteStatementEncoder.swift b/Sources/MongoQL/Commands/Delete/Mongo.DeleteStatementEncoder.swift index 875b0ccf..e141ab9a 100644 --- a/Sources/MongoQL/Commands/Delete/Mongo.DeleteStatementEncoder.swift +++ b/Sources/MongoQL/Commands/Delete/Mongo.DeleteStatementEncoder.swift @@ -75,10 +75,10 @@ extension Mongo.DeleteStatementEncoder set (value) { value?.encode(to: &self.bson[with: key]) } } } -extension Mongo.DeleteStatementEncoder +extension Mongo.DeleteStatementEncoder:Mongo.HintableEncoder { @frozen public - enum Hint:String, Hashable, Sendable + enum Hint:String, Sendable { case hint } @@ -91,9 +91,13 @@ extension Mongo.DeleteStatementEncoder } @inlinable public - subscript(key:Hint) -> Mongo.SortDocument? + subscript(key:Hint, + using _:IndexKey.Type = IndexKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { - get { nil } - set (value) { value?.encode(to: &self.bson[with: key]) } + mutating get + { + yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) + } } -} +} \ No newline at end of file diff --git a/Sources/MongoQL/Commands/Find/Mongo.Find.swift b/Sources/MongoQL/Commands/Find/Mongo.Find.swift index 015aad42..aa50cee7 100644 --- a/Sources/MongoQL/Commands/Find/Mongo.Find.swift +++ b/Sources/MongoQL/Commands/Find/Mongo.Find.swift @@ -193,10 +193,10 @@ extension Mongo.Find } } } -extension Mongo.Find +extension Mongo.Find:Mongo.HintableEncoder { @frozen public - enum Hint:String, Hashable, Sendable + enum Hint:String, Sendable { case hint } @@ -204,22 +204,18 @@ extension Mongo.Find @inlinable public subscript(key:Hint) -> String? { - get - { - nil - } - set(value) - { - value?.encode(to: &self.fields[with: key]) - } + get { nil } + set (value) { value?.encode(to: &self.fields[with: key]) } } @inlinable public - subscript(key:Hint, yield:(inout Mongo.SortEncoder) -> ()) -> Void + subscript(key:Hint, + using _:IndexKey.Type = IndexKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get { - yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) + yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) } } } @@ -302,20 +298,22 @@ extension Mongo.Find } } } -extension Mongo.Find +extension Mongo.Find:Mongo.SortableEncoder { @frozen public - enum Sort:String, Hashable, Sendable + enum Sort:String, Sendable { case sort } @inlinable public - subscript(key:Sort, yield:(inout Mongo.SortEncoder) -> ()) -> Void + subscript(key:Sort, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get { - yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) + yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) } } } diff --git a/Sources/MongoQL/Commands/FindAndModify/Mongo.FindAndModify.swift b/Sources/MongoQL/Commands/FindAndModify/Mongo.FindAndModify.swift index 9df2f39e..de47edcf 100644 --- a/Sources/MongoQL/Commands/FindAndModify/Mongo.FindAndModify.swift +++ b/Sources/MongoQL/Commands/FindAndModify/Mongo.FindAndModify.swift @@ -144,10 +144,10 @@ extension Mongo.FindAndModify } } } -extension Mongo.FindAndModify +extension Mongo.FindAndModify:Mongo.HintableEncoder { @frozen public - enum Hint:String, Hashable, Sendable + enum Hint:String, Sendable { case hint } @@ -155,22 +155,18 @@ extension Mongo.FindAndModify @inlinable public subscript(key:Hint) -> String? { - get - { - nil - } - set(value) - { - value?.encode(to: &self.fields[with: key]) - } + get { nil } + set (value) { value?.encode(to: &self.fields[with: key]) } } @inlinable public - subscript(key:Hint, yield:(inout Mongo.SortEncoder) -> ()) -> Void + subscript(key:Hint, + using _:IndexKey.Type = IndexKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get { - yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) + yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) } } } @@ -215,20 +211,22 @@ extension Mongo.FindAndModify } } } -extension Mongo.FindAndModify +extension Mongo.FindAndModify:Mongo.SortableEncoder { @frozen public - enum Sort:String, Hashable, Sendable + enum Sort:String, Sendable { case sort } @inlinable public - subscript(key:Sort, yield:(inout Mongo.SortEncoder) -> ()) -> Void + subscript(key:Sort, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get { - yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) + yield(&self.fields[with: key][as: Mongo.SortEncoder.self]) } } } diff --git a/Sources/MongoQL/Commands/Mongo.HintableEncoder.swift b/Sources/MongoQL/Commands/Mongo.HintableEncoder.swift new file mode 100644 index 00000000..2553fb63 --- /dev/null +++ b/Sources/MongoQL/Commands/Mongo.HintableEncoder.swift @@ -0,0 +1,23 @@ +extension Mongo +{ + public + protocol HintableEncoder + { + associatedtype Hint:RawRepresentable + + subscript(key:Hint) -> String? { get set } + + subscript(key:Hint, + using _:IndexKey.Type, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get } + } +} +extension Mongo.HintableEncoder +{ + @available(*, unavailable) + @inlinable public + subscript(key:Hint) -> Mongo.SortDocument? + { + nil + } +} diff --git a/Sources/MongoQL/Commands/Mongo.SortableEncoder.swift b/Sources/MongoQL/Commands/Mongo.SortableEncoder.swift new file mode 100644 index 00000000..46fab6da --- /dev/null +++ b/Sources/MongoQL/Commands/Mongo.SortableEncoder.swift @@ -0,0 +1,21 @@ +extension Mongo +{ + public + protocol SortableEncoder + { + associatedtype Sort:RawRepresentable + + subscript(key:Sort, + using _:IndexKey.Type, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { mutating get } + } +} +extension Mongo.SortableEncoder +{ + @available(*, unavailable) + @inlinable public + subscript(key:Sort) -> Mongo.SortDocument? + { + nil + } +} diff --git a/Sources/MongoQL/Commands/Update/Mongo.UpdateStatementEncoder.swift b/Sources/MongoQL/Commands/Update/Mongo.UpdateStatementEncoder.swift index 8e88b566..8c40bd24 100644 --- a/Sources/MongoQL/Commands/Update/Mongo.UpdateStatementEncoder.swift +++ b/Sources/MongoQL/Commands/Update/Mongo.UpdateStatementEncoder.swift @@ -156,10 +156,10 @@ extension Mongo.UpdateStatementEncoder set (value) { value?.encode(to: &self.bson[with: key]) } } } -extension Mongo.UpdateStatementEncoder +extension Mongo.UpdateStatementEncoder:Mongo.HintableEncoder { @frozen public - enum Hint:String, Hashable, Sendable + enum Hint:String, Sendable { case hint } @@ -172,10 +172,14 @@ extension Mongo.UpdateStatementEncoder } @inlinable public - subscript(key:Hint) -> Mongo.SortDocument? + subscript(key:Hint, + using _:CodingKey.Type = CodingKey.self, + yield:(inout Mongo.SortEncoder) -> ()) -> Void { - get { nil } - set (value) { value?.encode(to: &self.bson[with: key]) } + mutating get + { + yield(&self.bson[with: key][as: Mongo.SortEncoder.self]) + } } } extension Mongo.UpdateStatementEncoder