diff --git a/Serialization.Test/ExampleProtoClass.fs b/Serialization.Test/ExampleProtoClass.fs index b77c7f9..ae7045a 100644 --- a/Serialization.Test/ExampleProtoClass.fs +++ b/Serialization.Test/ExampleProtoClass.fs @@ -108,13 +108,13 @@ module SampleNamespace = member m.Serialize zcb = Serialize.toZeroCopyBuffer m zcb member m.SerializeLengthDelimited () = Serialize.toArrayLD m - static member Deserialize buf = buf |> Deserialize.fromArray (InnerMessage()) - static member Deserialize buf = buf |> Deserialize.fromArraySegment (InnerMessage()) - static member Deserialize zcb = zcb |> Deserialize.fromZeroCopyBuffer (InnerMessage()) - static member Deserialize raw = raw |> Deserialize.fromRawField (InnerMessage()) - static member DeserializeLengthDelimited buf = buf |> Deserialize.fromArrayLD (InnerMessage()) - static member DeserializeLengthDelimited buf = buf |> Deserialize.fromArraySegmentLD (InnerMessage()) - static member DeserializeLengthDelimited zcb = zcb |> Deserialize.fromZcbLD (InnerMessage()) + static member Deserialize buf = buf |> Deserialize.Proto2.fromArray (InnerMessage()) + static member Deserialize buf = buf |> Deserialize.Proto2.fromArraySegment (InnerMessage()) + static member Deserialize zcb = zcb |> Deserialize.Proto2.fromZeroCopyBuffer (InnerMessage()) + static member Deserialize raw = raw |> Deserialize.Proto2.fromRawField (InnerMessage()) + static member DeserializeLengthDelimited buf = buf |> Deserialize.Proto2.fromArrayLD (InnerMessage()) + static member DeserializeLengthDelimited buf = buf |> Deserialize.Proto2.fromArraySegmentLD (InnerMessage()) + static member DeserializeLengthDelimited zcb = zcb |> Deserialize.Proto2.fromZcbLD (InnerMessage()) @@ -158,7 +158,7 @@ module PerformanceTest = let zcr = Froto.Serialization.ZeroCopyBuffer(zcw.Array) seq { while not zcr.IsEof do - yield zcr |> Deserialize.fromZcbLD (InnerMessage()) + yield zcr |> Deserialize.Proto2.fromZcbLD (InnerMessage()) } ys |> Seq.iter ignore diff --git a/Serialization.Test/ExampleProtoRecord.fs b/Serialization.Test/ExampleProtoRecord.fs index a195bff..31d4e10 100644 --- a/Serialization.Test/ExampleProtoRecord.fs +++ b/Serialization.Test/ExampleProtoRecord.fs @@ -115,7 +115,7 @@ module PerformanceTest = let zcr = Froto.Serialization.ZeroCopyBuffer(zcw.Array) seq { while not zcr.IsEof do - yield zcr |> Deserialize.fromZcbLD InnerSample.Default + yield zcr |> Deserialize.Proto2.fromZcbLD InnerSample.Default } ys |> Seq.iter ignore diff --git a/Serialization.Test/TestClassSerialization.fs b/Serialization.Test/TestClassSerialization.fs index 4134770..2d286fd 100644 --- a/Serialization.Test/TestClassSerialization.fs +++ b/Serialization.Test/TestClassSerialization.fs @@ -53,13 +53,13 @@ module ClassSerialization = member m.Serialize zcb = Serialize.toZeroCopyBuffer m zcb member m.SerializeLengthDelimited () = Serialize.toArrayLD m - static member Deserialize buf = buf |> Deserialize.fromArray (InnerMessage()) - static member Deserialize buf = buf |> Deserialize.fromArraySegment (InnerMessage()) - static member Deserialize zcb = zcb |> Deserialize.fromZeroCopyBuffer (InnerMessage()) - static member Deserialize raw = raw |> Deserialize.fromRawField (InnerMessage()) - static member DeserializeLengthDelimited buf = buf |> Deserialize.fromArrayLD (InnerMessage()) - static member DeserializeLengthDelimited buf = buf |> Deserialize.fromArraySegmentLD (InnerMessage()) - static member DeserializeLengthDelimited zcb = zcb |> Deserialize.fromZcbLD (InnerMessage()) + static member Deserialize buf = buf |> Deserialize.Proto2.fromArray (InnerMessage()) + static member Deserialize buf = buf |> Deserialize.Proto2.fromArraySegment (InnerMessage()) + static member Deserialize zcb = zcb |> Deserialize.Proto2.fromZeroCopyBuffer (InnerMessage()) + static member Deserialize raw = raw |> Deserialize.Proto2.fromRawField (InnerMessage()) + static member DeserializeLengthDelimited buf = buf |> Deserialize.Proto2.fromArrayLD (InnerMessage()) + static member DeserializeLengthDelimited buf = buf |> Deserialize.Proto2.fromArraySegmentLD (InnerMessage()) + static member DeserializeLengthDelimited zcb = zcb |> Deserialize.Proto2.fromZcbLD (InnerMessage()) [] @@ -155,13 +155,13 @@ module ClassSerialization = member m.Serialize zcb = Serialize.toZeroCopyBuffer m zcb member m.SerializeLengthDelimited () = Serialize.toArrayLD m - static member Deserialize buf = buf |> Deserialize.fromArray (OuterMessage()) - static member Deserialize buf = buf |> Deserialize.fromArraySegment (OuterMessage()) - static member Deserialize zcb = zcb |> Deserialize.fromZeroCopyBuffer (OuterMessage()) - static member Deserialize raw = raw |> Deserialize.fromRawField (OuterMessage()) - static member DeserializeLengthDelimited buf = buf |> Deserialize.fromArrayLD (OuterMessage()) - static member DeserializeLengthDelimited buf = buf |> Deserialize.fromArraySegmentLD (OuterMessage()) - static member DeserializeLengthDelimited zcb = zcb |> Deserialize.fromZcbLD (OuterMessage()) + static member Deserialize buf = buf |> Deserialize.Proto2.fromArray (OuterMessage()) + static member Deserialize buf = buf |> Deserialize.Proto2.fromArraySegment (OuterMessage()) + static member Deserialize zcb = zcb |> Deserialize.Proto2.fromZeroCopyBuffer (OuterMessage()) + static member Deserialize raw = raw |> Deserialize.Proto2.fromRawField (OuterMessage()) + static member DeserializeLengthDelimited buf = buf |> Deserialize.Proto2.fromArrayLD (OuterMessage()) + static member DeserializeLengthDelimited buf = buf |> Deserialize.Proto2.fromArraySegmentLD (OuterMessage()) + static member DeserializeLengthDelimited zcb = zcb |> Deserialize.Proto2.fromZcbLD (OuterMessage()) [] diff --git a/Serialization.Test/TestSerialization.fs b/Serialization.Test/TestSerialization.fs index 0c55afb..aeea1ad 100644 --- a/Serialization.Test/TestSerialization.fs +++ b/Serialization.Test/TestSerialization.fs @@ -64,7 +64,7 @@ module RecordSerialization = 0x54uy; 0x65uy; 0x73uy; 0x74uy; 0x20uy; 0x6duy; 0x65uy; 0x73uy; 0x73uy; 0x61uy; 0x67uy; 0x65uy // value "Test message" |] - let msg = buf |> Deserialize.fromArray InnerMessage.Default + let msg = buf |> Deserialize.Proto2.fromArray InnerMessage.Default msg.id |> should equal 99 msg.name |> should equal "Test message" @@ -79,7 +79,7 @@ module RecordSerialization = 0x54uy; 0x65uy; 0x73uy; 0x74uy; 0x20uy; 0x6duy; 0x65uy; 0x73uy; 0x73uy; 0x61uy; 0x67uy; 0x65uy // value "Test message" |] - fun () -> buf |> Deserialize.fromArray InnerMessage.Default |> ignore + fun () -> buf |> Deserialize.Proto2.fromArray InnerMessage.Default |> ignore |> should throw typeof [] @@ -119,7 +119,7 @@ module RecordSerialization = static member DecoderRing = [ 1 , fun m rawField -> { m with id = Decode.toInt32 rawField } : OuterMessage - 42, fun m rawField -> { m with inner = Deserialize.optionalMessage InnerMessage.Default rawField} : OuterMessage + 42, fun m rawField -> { m with inner = Deserialize.Proto2.optionalMessage InnerMessage.Default rawField} : OuterMessage 43, fun m rawField -> { m with hasMore = Decode.toBool rawField } : OuterMessage ] |> Map.ofList @@ -146,7 +146,7 @@ module RecordSerialization = 0xD8uy ||| 0uy; 0x02uy; // tag: fldnum=43, varint 0x01uy; // value true |] - let msg = buf |> Deserialize.fromArray OuterMessage.Default + let msg = buf |> Deserialize.Proto2.fromArray OuterMessage.Default msg.id |> should equal 21 msg.inner.IsSome |> should equal true msg.inner.Value.id |> should equal 99 @@ -175,4 +175,129 @@ module RecordSerialization = 0xD8uy ||| 0uy; 0x02uy; // tag: fldnum=43, varint 0x01uy; // value true |] + + ///If you require the collection of unknown fields in your record type definitions then you can + ///use the following definition as a guide. + ///Note the _unknownFields definition as part of the record definition, zero entry in the DecoderRing, + ///the UnknownFields method and DecodeFixup has to reverse the order of the _unknownFields list. + type Proto3Message = { + id : int32 + name : string + _unknownFields : RawField list + } + with + static member Default = { + id = 0 + name = "" + _unknownFields = List.empty + } + + static member Serializer (m, zcb) = + (m.id |> Encode.fromVarint 1) >> + (m.name |> Encode.fromString 2) >> + (m._unknownFields|> Encode.fromRawFields) + <| zcb + + static member DecoderRing = + [ + 0, fun m rawField -> { m with _unknownFields = rawField :: m._unknownFields } : Proto3Message + 1, fun m rawField -> { m with id = rawField |> Decode.toInt32 } : _ + 2, fun m rawField -> { m with name = rawField |> Decode.toString } : _ + ] + |> Map.ofList + + static member DecodeFixup m = + { m with _unknownFields = List.rev m._unknownFields } + + static member UnknownFields m = + m._unknownFields + + [] + let ``Serialize proto3 message`` () = + let msg = { Proto3Message.Default with + id = 5 + name = "TEST" } + let serialised = msg |> Serialize.toArray + printfn "%A" serialised + serialised + |> should equal + [| + 1uy <<< 3 ||| 0uy; 5uy // field 1, type 0; value 5 + 2uy <<< 3 ||| 2uy; // field 2, type 2 + 4uy; // length + 84uy; 69uy; 83uy; 84uy // TEST + |] + + [] + let ``Deserialize proto3 message`` () = + let buf = + [| + 1uy <<< 3 ||| 0uy; 5uy // field 1, type 0; value 5 + 2uy <<< 3 ||| 2uy; // field 2, type 2 + 4uy; // length + 84uy; 69uy; 83uy; 84uy // TEST + |] + let msg = buf |> Deserialize.Proto3.fromArray Proto3Message.Default + msg.id |> should equal 5 + msg.name |> should equal "TEST" + + [] + let ``Deserialize proto3 message with extra field`` () = + let buf = + [| + 1uy <<< 3 ||| 0uy; 5uy // field 1, type 0; value 5 + 2uy <<< 3 ||| 2uy; // field 2, type 2 + 4uy; // length + 84uy; 69uy; 83uy; 84uy // TEST + 3uy <<< 3 ||| 0uy; 42uy //extra field number 3, type varint, value 42 + |] + let msg = buf |> Deserialize.Proto3.fromArray Proto3Message.Default + msg.id |> should equal 5 + msg.name |> should equal "TEST" + let unknown = + msg._unknownFields + |> List.tryHead + |> Option.toList + |> List.map (fun v -> v.FieldNum, v.WireType) + unknown |> should equal [3, WireType.Varint] + + ///If you dont require the optional collection of Unknown Fields then your record type definitions + ///can be described like the following. + ///Note the absence of a zero entry in the DecoderRing, no UnknownFields and DecodeFixup has no work to do. + type Proto3MessageNoUnknown = { + id : int32 + name : string + } + with + static member Default = { + id = 0 + name = "" + } + static member Serializer (m, zcb) = + (m.id |> Encode.fromVarint 1) >> + (m.name |> Encode.fromString 2) + <| zcb + + static member DecoderRing = + [ + 1, fun m rawField -> { m with id = rawField |> Decode.toInt32 } : Proto3MessageNoUnknown + 2, fun m rawField -> { m with name = rawField |> Decode.toString } : _ + ] + |> Map.ofList + + static member DecodeFixup m = m + + [] + let ``Deserialize proto3 message discarding extra field`` () = + let buf = + [| + 1uy <<< 3 ||| 0uy; 5uy // field 1, type 0; value 5 + 2uy <<< 3 ||| 2uy; // field 2, type 2 + 4uy; // length + 84uy; 69uy; 83uy; 84uy // TEST + 3uy <<< 3 ||| 0uy; 42uy //extra field number 3, type varint, value 42 + |] + let msg = buf |> Deserialize.Proto3.fromArray Proto3MessageNoUnknown.Default + msg.id |> should equal 5 + msg.name |> should equal "TEST" diff --git a/Serialization/Serialization.fs b/Serialization/Serialization.fs index 94e6d35..38e6f3a 100644 --- a/Serialization/Serialization.fs +++ b/Serialization/Serialization.fs @@ -18,19 +18,28 @@ /// /// Serializer : (m:^T, ZeroCopyBuffer) -> ZeroCopyBuffer /// -/// Deserializable types must provide, at minimum, the following static +/// For proto2 Deserializable types must provide, at minimum, the following static /// methods. /// /// * DecoderRing - maps FieldId to a deserialization function /// * RememberFound - adds a FieldId to list of found fields /// * DecodeFixup - called after decoding the message -/// * RequiredFields- list of (proto2) required fields; can be empty +/// * RequiredFields- list of required fields; can be empty /// * FoundFields - returns list of fields found -/// * UnknownFields - returns list of unknown fields /// -/// These can be associated with any valid F# type, including Records and -/// Classes, because the serialization functions use Static Type Constraints -/// to locate these static methods. +/// If you are using proto3 Deserializable types then you must provide, +/// at minimum, the following static methods. +/// +/// * DecoderRing - maps FieldId to a deserialization function +/// * DecodeFixup - called after decoding the message +/// +/// The Proto3 module should be used to deserialize rather than functions inside +/// the Deserialize module e.g. +/// Deserialise.Proto3.fromArray message.Default bytes +/// +/// The static methods mentioned above can be associated with any valid F# type, +/// including Records and Classes, because the serialization functions use +/// Static Type Constraints to locate these static methods. /// /// DecoderRing : Map < int, 'T -> RawField -> 'T > /// @@ -165,125 +174,265 @@ module Serialize = module Deserialize = module Helpers = - - let inline decodeFixup (m:^msg) = - (^msg : (static member DecodeFixup : ^msg -> ^msg) (m) ) - - let inline deserializeFields m fields = - - let inline decoderRing (m:^msg) = - (^msg : (static member DecoderRing: Map RawField -> ^msg>) () ) + module Proto2 = + let inline deserializeFields m fields = - let inline requiredFields (m:^msg) = - (^msg : (static member RequiredFields: Set) () ) - - let inline foundFields (m:^msg) = - (^msg : (static member FoundFields: ^msg -> Set) (m) ) - - let inline rememberFound (m:^msg) fieldNum = - (^msg : (static member RememberFound : ^msg -> FieldNum -> ^msg) (m,fieldNum) ) - - let inline fetchDecoder decoderRing (field:RawField) = - let decode decoder m (rawField:RawField) = - let m = rememberFound m (rawField.FieldNum) - in decoder m rawField - - let n = field.FieldNum - match decoderRing |> Map.tryFind n with - | Some(decoder) -> (decode decoder, field) - | None -> - match decoderRing |> Map.tryFind 0 with + let inline decoderRing (m:^msg) = + (^msg : (static member DecoderRing: Map RawField -> ^msg>) () ) + + let inline requiredFields (m:^msg) = + (^msg : (static member RequiredFields: Set) () ) + + let inline foundFields (m:^msg) = + (^msg : (static member FoundFields: ^msg -> Set) (m) ) + + let inline rememberFound (m:^msg) fieldNum = + (^msg : (static member RememberFound : ^msg -> FieldNum -> ^msg) (m,fieldNum) ) + + let inline fetchDecoder decoderRing (field:RawField) = + let decode decoder m (rawField:RawField) = + let m = rememberFound m (rawField.FieldNum) + in decoder m rawField + + let n = field.FieldNum + match decoderRing |> Map.tryFind n with | Some(decoder) -> (decode decoder, field) | None -> - raise <| SerializerException(sprintf "Invalid decoder ring; encountered unknown field '%d' and ring must include an entry for field number 0 to handle unknown fields" n) - - /// decode a sequence of fields, given a decoder ring and a default or mutable message. - /// Note that a List would perform slightly better, but demand more memory during operation. - let inline decode decoderRing m fields = - fields - |> Seq.map (fetchDecoder decoderRing) - |> Seq.fold (fun acc (fn, fld) -> fn acc fld) m - - - let m = decode (decoderRing m) m fields - let missingFields = (requiredFields m) - (foundFields m) - if Set.isEmpty missingFields - then + match decoderRing |> Map.tryFind 0 with + | Some(decoder) -> (decode decoder, field) + | None -> + raise <| SerializerException(sprintf "Invalid decoder ring; encountered unknown field '%d' and ring must include an entry for field number 0 to handle unknown fields" n) + + /// decode a sequence of fields, given a decoder ring and a default or mutable message. + /// Note that a List would perform slightly better, but demand more memory during operation. + let inline decode decoderRing m fields = + fields + |> Seq.map (fetchDecoder decoderRing) + |> Seq.fold (fun acc (fn, fld) -> fn acc fld) m + + + let m = decode (decoderRing m) m fields + let missingFields = (requiredFields m) - (foundFields m) + if Set.isEmpty missingFields + then + m + else + raise <| SerializerException(sprintf "Missing required fields %A" missingFields) + + module Proto3 = + let inline deserializeFields m fields = + + let inline decoderRing (m:^msg) = + (^msg : (static member DecoderRing: Map RawField -> ^msg>) () ) + + let inline fetchDecoder decoderRing (field:RawField) = + let decode decoder m (rawField:RawField) = + decoder m rawField + + let n = field.FieldNum + match decoderRing |> Map.tryFind n with + | Some(decoder) -> (decode decoder, field) + | None -> + match decoderRing |> Map.tryFind 0 with + | Some(decoder) -> (decode decoder, field) + //No action for unknown fields in proto3 if there is no supplied field mapping + | None -> (fun m _ -> m), field + + /// decode a sequence of fields, given a decoder ring and a default or mutable message. + /// Note that a List would perform slightly better, but demand more memory during operation. + let inline decode decoderRing m fields = + fields + |> Seq.map (fetchDecoder decoderRing) + |> Seq.fold (fun acc (fn, fld) -> fn acc fld) m + + let m = decode (decoderRing m) m fields m - else - raise <| SerializerException(sprintf "Missing required fields %A" missingFields) - - /// Deserialize a message from a ZeroCopyBuffer, given a default message. - let inline fromZeroCopyBuffer m zcb = - zcb - |> Utility.decodeBuffer - |> Helpers.deserializeFields m - |> Helpers.decodeFixup - - /// Deserialize a message from a ZeroCopyBuffer, given a default message. - /// Shorthand for Deserialize.fromZeroCopyBuffer. - let inline fromZcb m zcb = fromZeroCopyBuffer m zcb - - /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. - let inline fromZeroCopyBufferLengthDelimited m zcb = - zcb - |> Utility.unpackLengthDelimited - |> Helpers.deserializeFields m - |> Helpers.decodeFixup - - /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. - /// Shorthand for Deserialize.fromZeroCopyBufferLengthDelimited. - let inline fromZcbLD m zcb = fromZeroCopyBufferLengthDelimited m zcb - - /// Deserialize a message from a length-delimited RawField, given a default message. - let inline fromRawField m (rawField:RawField) = - let buf = - match rawField with - | LengthDelimited (fieldId, buf) -> - buf - | _ -> - raise <| SerializerException(sprintf "Expected LengthDelimited field, found %s" (rawField.GetType().Name) ) - buf - |> ZeroCopyBuffer - |> fromZeroCopyBuffer m - - /// Deserialize a message from a length-delimited RawField, given a default message, - /// and return Some(message). Used to simplify the call-site when deserializing - /// inner messages. - let inline optionalMessage m rawField = - Some (fromRawField m rawField) - - /// Deserialize a message from an ArraySegment, given a default message. - let inline fromArraySegment m (buf:ArraySegment) = - buf - |> ZeroCopyBuffer - |> fromZcb m - - /// Deserialize a length-delimited message from an ArraySegment, given a default message. - let inline fromArraySegmentLengthDelimited m (buf:ArraySegment) = - buf - |> ZeroCopyBuffer - |> fromZcbLD m - - /// Deserialize a length-delimited message from an ArraySegment, given a default message. - /// Shorthand for Deserialize.fromArraySegmentLengthDelimited. - let inline fromArraySegmentLD m buf = fromArraySegmentLengthDelimited m buf - - /// Deserialize a message from a byte array, given a default message. - let inline fromArray m buf = - buf - |> ArraySegment - |> fromArraySegment m - - /// Deserialize a length-delimited message from a byte array, given a default message. - let inline fromArrayLengthDelimited m buf = - buf - |> ArraySegment - |> fromArraySegmentLD m - - /// Deserialize a length-delimited message from a byte array, given a default message. - /// Shorthand for Deserialize.fromArrayLengthDelimited. - let inline fromArrayLD m buf = fromArrayLengthDelimited m buf - - + module Shared = + + let inline decodeFixup (m:^msg) = + (^msg : (static member DecodeFixup : ^msg -> ^msg) (m) ) + + /// Deserialize a message from a ZeroCopyBuffer, given a default message. + let inline fromZeroCopyBuffer deserializer m zcb = + zcb + |> Utility.decodeBuffer + |> deserializer m + |> decodeFixup + + /// Deserialize a message from a ZeroCopyBuffer, given a default message. + /// Shorthand for Deserialize.fromZeroCopyBuffer. + let inline fromZcb m zcb = fromZeroCopyBuffer m zcb + + /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. + let inline fromZeroCopyBufferLengthDelimited deserializer m zcb = + zcb + |> Utility.unpackLengthDelimited + |> deserializer m + |> decodeFixup + + /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. + /// Shorthand for Deserialize.fromZeroCopyBufferLengthDelimited. + let inline fromZcbLD deserializer m zcb = fromZeroCopyBufferLengthDelimited deserializer m zcb + + /// Deserialize a message from a length-delimited RawField, given a default message. + let inline fromRawField deserializer m (rawField:RawField) = + let buf = + match rawField with + | LengthDelimited (fieldId, buf) -> + buf + | _ -> + raise <| SerializerException(sprintf "Expected LengthDelimited field, found %s" (rawField.GetType().Name) ) + buf + |> ZeroCopyBuffer + |> fromZeroCopyBuffer deserializer m + + /// Deserialize a message from a length-delimited RawField, given a default message, + /// and return Some(message). Used to simplify the call-site when deserializing + /// inner messages. + let inline optionalMessage deserializer m rawField = + Some (fromRawField deserializer m rawField) + + /// Deserialize a message from an ArraySegment, given a default message. + let inline fromArraySegment deserializer m (buf:ArraySegment) = + buf + |> ZeroCopyBuffer + |> fromZcb deserializer m + + /// Deserialize a length-delimited message from an ArraySegment, given a default message. + let inline fromArraySegmentLengthDelimited deserializer m (buf:ArraySegment) = + buf + |> ZeroCopyBuffer + |> fromZcbLD deserializer m + + /// Deserialize a length-delimited message from an ArraySegment, given a default message. + /// Shorthand for Deserialize.fromArraySegmentLengthDelimited. + let inline fromArraySegmentLD deserializer m buf = fromArraySegmentLengthDelimited deserializer m buf + + /// Deserialize a message from a byte array, given a default message. + let inline fromArray deserializer m buf = + buf + |> ArraySegment + |> fromArraySegment deserializer m + + /// Deserialize a length-delimited message from a byte array, given a default message. + let inline fromArrayLengthDelimited deserializer m buf = + buf + |> ArraySegment + |> fromArraySegmentLD deserializer m + + /// Deserialize a length-delimited message from a byte array, given a default message. + /// Shorthand for Deserialize.fromArrayLengthDelimited. + let inline fromArrayLD deserializer m buf = fromArrayLengthDelimited deserializer m buf + + module Proto2 = + open Helpers.Proto2 + /// Deserialize a message from a ZeroCopyBuffer, given a default message. + let inline fromZeroCopyBuffer m zcb = + Shared.fromZeroCopyBuffer deserializeFields m zcb + + /// Deserialize a message from a ZeroCopyBuffer, given a default message. + /// Shorthand for Deserialize.fromZeroCopyBuffer. + let inline fromZcb m zcb = + Shared.fromZeroCopyBuffer deserializeFields m zcb + + /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. + let inline fromZeroCopyBufferLengthDelimited m zcb = + Shared.fromZeroCopyBufferLengthDelimited deserializeFields m zcb + + /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. + /// Shorthand for Deserialize.fromZeroCopyBufferLengthDelimited. + let inline fromZcbLD m zcb = + Shared.fromZeroCopyBufferLengthDelimited deserializeFields m zcb + + /// Deserialize a message from a length-delimited RawField, given a default message. + let inline fromRawField m (rawField:RawField) = + Shared.fromRawField deserializeFields m rawField + + /// Deserialize a message from a length-delimited RawField, given a default message, + /// and return Some(message). Used to simplify the call-site when deserializing + /// inner messages. + let inline optionalMessage m rawField = + Shared.optionalMessage deserializeFields m rawField + + /// Deserialize a message from an ArraySegment, given a default message. + let inline fromArraySegment m (buf:ArraySegment) = + Shared.fromArraySegment deserializeFields m buf + + /// Deserialize a length-delimited message from an ArraySegment, given a default message. + let inline fromArraySegmentLengthDelimited m (buf:ArraySegment) = + Shared.fromArraySegmentLengthDelimited deserializeFields m buf + + /// Deserialize a length-delimited message from an ArraySegment, given a default message. + /// Shorthand for Deserialize.fromArraySegmentLengthDelimited. + let inline fromArraySegmentLD m buf = + Shared.fromArraySegmentLengthDelimited deserializeFields m buf + + /// Deserialize a message from a byte array, given a default message. + let inline fromArray m buf = + Shared.fromArray deserializeFields m buf + + /// Deserialize a length-delimited message from a byte array, given a default message. + let inline fromArrayLengthDelimited m buf = + Shared.fromArrayLengthDelimited deserializeFields m buf + + /// Deserialize a length-delimited message from a byte array, given a default message. + /// Shorthand for Deserialize.fromArrayLengthDelimited. + let inline fromArrayLD m buf = + Shared.fromArrayLengthDelimited deserializeFields m buf + + module Proto3 = + open Helpers.Proto3 + /// Deserialize a message from a ZeroCopyBuffer, given a default message. + let inline fromZeroCopyBuffer m zcb = + Shared.fromZeroCopyBuffer deserializeFields m zcb + + /// Deserialize a message from a ZeroCopyBuffer, given a default message. + /// Shorthand for Deserialize.fromZeroCopyBuffer. + let inline fromZcb m zcb = + Shared.fromZeroCopyBuffer deserializeFields m zcb + + /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. + let inline fromZeroCopyBufferLengthDelimited m zcb = + Shared.fromZeroCopyBufferLengthDelimited deserializeFields m zcb + + /// Deserialize a length-delimited message from a ZeroCopyBuffer, given a default message. + /// Shorthand for Deserialize.fromZeroCopyBufferLengthDelimited. + let inline fromZcbLD m zcb = + Shared.fromZeroCopyBufferLengthDelimited deserializeFields m zcb + + /// Deserialize a message from a length-delimited RawField, given a default message. + let inline fromRawField m (rawField:RawField) = + Shared.fromRawField deserializeFields m rawField + + /// Deserialize a message from a length-delimited RawField, given a default message, + /// and return Some(message). Used to simplify the call-site when deserializing + /// inner messages. + let inline optionalMessage m rawField = + Shared.optionalMessage deserializeFields m rawField + + /// Deserialize a message from an ArraySegment, given a default message. + let inline fromArraySegment m (buf:ArraySegment) = + Shared.fromArraySegment deserializeFields m buf + + /// Deserialize a length-delimited message from an ArraySegment, given a default message. + let inline fromArraySegmentLengthDelimited m (buf:ArraySegment) = + Shared.fromArraySegmentLengthDelimited deserializeFields m buf + + /// Deserialize a length-delimited message from an ArraySegment, given a default message. + /// Shorthand for Deserialize.fromArraySegmentLengthDelimited. + let inline fromArraySegmentLD m buf = + Shared.fromArraySegmentLengthDelimited deserializeFields m buf + + /// Deserialize a message from a byte array, given a default message. + let inline fromArray m buf = + Shared.fromArray deserializeFields m buf + + /// Deserialize a length-delimited message from a byte array, given a default message. + let inline fromArrayLengthDelimited m buf = + Shared.fromArrayLengthDelimited deserializeFields m buf + + /// Deserialize a length-delimited message from a byte array, given a default message. + /// Shorthand for Deserialize.fromArrayLengthDelimited. + let inline fromArrayLD m buf = + Shared.fromArrayLengthDelimited deserializeFields m buf \ No newline at end of file