Skip to content

Commit 3e67c23

Browse files
authored
chore: Update to net80, formatting (#114)
1 parent 739bdda commit 3e67c23

28 files changed

+147
-176
lines changed

FsCodec.sln.DotSettings

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
2+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pickler/@EntryIndexedValue">True</s:Boolean>
3+
<s:Boolean x:Key="/Default/UserDictionary/Words/=roundtrips/@EntryIndexedValue">True</s:Boolean>
24
<s:Boolean x:Key="/Default/UserDictionary/Words/=serdes/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

global.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"sdk": {
3-
"version": "6.0.202",
3+
"version": "8.0.100",
44
"rollForward": "latestMajor"
55
}
66
}

src/FsCodec.Box/ByteArray.fs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
namespace FsCodec
22

3-
open System.Runtime.CompilerServices
43
open System
4+
open System.Runtime.CompilerServices
55

66
[<Extension; AbstractClass; Sealed>]
77
type ByteArray private () =
88

9-
static member BytesToReadOnlyMemory(x : byte[]) : ReadOnlyMemory<byte> =
9+
static member BytesToReadOnlyMemory(x: byte[]): ReadOnlyMemory<byte> =
1010
if x = null then ReadOnlyMemory.Empty
1111
else ReadOnlyMemory x
1212

13-
static member ReadOnlyMemoryToBytes(x : ReadOnlyMemory<byte>) : byte[] =
13+
static member ReadOnlyMemoryToBytes(x: ReadOnlyMemory<byte>): byte[] =
1414
if x.IsEmpty then null
1515
else x.ToArray()
1616

1717
/// <summary>Adapt an IEventCodec that handles ReadOnlyMemory&lt;byte&gt; Event Bodies to instead use <c>byte[]</c>
1818
/// Ideally not used as it makes pooling problematic; only provided for interop/porting scaffolding wrt Equinox V3 and EventStore.Client etc</summary>
1919
[<Extension>]
20-
static member ToByteArrayCodec<'Event, 'Context>(native : IEventCodec<'Event, ReadOnlyMemory<byte>, 'Context>)
20+
static member ToByteArrayCodec<'Event, 'Context>(native: IEventCodec<'Event, ReadOnlyMemory<byte>, 'Context>)
2121
: IEventCodec<'Event, byte[], 'Context> =
2222
FsCodec.Core.EventCodec.Map(native, Func<_, _> ByteArray.ReadOnlyMemoryToBytes, Func<_, _> ByteArray.BytesToReadOnlyMemory)

src/FsCodec.Box/Codec.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ open System.Runtime.InteropServices
1414
[<AbstractClass; Sealed>]
1515
type Codec private () =
1616

17-
static let defEncoder : TypeShape.UnionContract.IEncoder<obj> = TypeShape.UnionContract.BoxEncoder() :> _
17+
static let defEncoder: TypeShape.UnionContract.IEncoder<obj> = TypeShape.UnionContract.BoxEncoder() :> _
1818

1919
/// <summary>Generate an <c>IEventCodec</c> that handles <c>obj</c> (boxed .NET <c>Object</c>) Event Bodies.<br/>
2020
/// Uses <c>up</c>, <c>down</c> functions to handle upconversion/downconversion and eventId/correlationId/causationId mapping

src/FsCodec.Box/Compression.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type [<Struct>] CompressionOptions = { minSize: int; minGain: int } with
6969
static member Uncompressed = { minSize = Int32.MaxValue; minGain = 0 }
7070

7171
[<Extension; AbstractClass; Sealed>]
72-
type Compression =
72+
type Compression private () =
7373

7474
static member Utf8ToEncodedDirect(x: ReadOnlyMemory<byte>): EncodedBody =
7575
EncodedMaybeCompressed.encodeUncompressed x

src/FsCodec.Box/CoreCodec.fs

+5-5
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ type Codec private () =
3939
{ new FsCodec.IEventCodec<'Event, 'Body, 'Context> with
4040

4141
member _.Encode(context, event) =
42-
let struct (c, meta : 'Meta voption, eventId, correlationId, causationId, timestamp) = down.Invoke(context, event)
42+
let struct (c, meta: 'Meta voption, eventId, correlationId, causationId, timestamp) = down.Invoke(context, event)
4343
let enc = dataCodec.Encode c
4444
let meta' = match meta with ValueSome x -> encoder.Encode<'Meta> x | ValueNone -> Unchecked.defaultof<'Body>
4545
EventData(enc.CaseName, enc.Payload, meta', eventId, correlationId, causationId, timestamp)
@@ -95,18 +95,18 @@ type Codec private () =
9595
[<Optional; DefaultParameterValue(null)>] ?rejectNullaryCases)
9696
: FsCodec.IEventCodec<'Event, 'Body, unit> =
9797

98-
let mapCausation () (m : 'Meta voption) = struct (m, Guid.NewGuid(), null, null)
98+
let mapCausation () (m: 'Meta voption) = struct (m, Guid.NewGuid(), null, null)
9999
Codec.Create(encoder, up = up, down = down, mapCausation = mapCausation, ?rejectNullaryCases = rejectNullaryCases)
100100

101101
/// <summary>Generate an <code>IEventCodec</code> using the supplied <c>encoder</c>.<br/>
102102
/// The Event Type Names are inferred based on either explicit <c>DataMember(Name=</c> Attributes, or (if unspecified) the Discriminated Union Case Name
103103
/// <c>'Union</c> must be tagged with <c>interface TypeShape.UnionContract.IUnionContract</c> to signify this scheme applies.</summary>
104104
static member Create<'Body, 'Union when 'Union :> TypeShape.UnionContract.IUnionContract>
105-
( encoder : TypeShape.UnionContract.IEncoder<'Body>,
105+
( encoder: TypeShape.UnionContract.IEncoder<'Body>,
106106
// <summary>Enables one to fail encoder generation if union contains nullary cases. Defaults to <c>false</c>, i.e. permitting them.</summary>
107107
[<Optional; DefaultParameterValue(null)>] ?rejectNullaryCases)
108108
: FsCodec.IEventCodec<'Union, 'Body, unit> =
109109

110-
let up (_e : FsCodec.ITimelineEvent<'Body>) (u : 'Union) : 'Union = u
111-
let down (event : 'Union) = struct (event, ValueNone (*Meta*), ValueNone (*Timestamp*))
110+
let up (_e: FsCodec.ITimelineEvent<'Body>) (u: 'Union): 'Union = u
111+
let down (event: 'Union) = struct (event, ValueNone (*Meta*), ValueNone (*Timestamp*))
112112
Codec.Create(encoder, up = up, down = down, ?rejectNullaryCases = rejectNullaryCases)

src/FsCodec.NewtonsoftJson/Codec.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
namespace FsCodec.NewtonsoftJson.Core
22

33
/// Newtonsoft.Json implementation of TypeShape.UnionContractEncoder's IEncoder that encodes direct to a UTF-8 ReadOnlyMemory<byte>
4-
type ReadOnlyMemoryEncoder(serdes : FsCodec.NewtonsoftJson.Serdes) =
4+
type ReadOnlyMemoryEncoder(serdes: FsCodec.NewtonsoftJson.Serdes) =
55
interface TypeShape.UnionContract.IEncoder<System.ReadOnlyMemory<byte>> with
66
member _.Empty = System.ReadOnlyMemory.Empty
77
member _.Encode(value: 'T) = serdes.SerializeToUtf8(value) |> System.ReadOnlyMemory
8-
member _.Decode(utf8json: System.ReadOnlyMemory<byte>) : 'T = serdes.Deserialize<'T>(utf8json)
8+
member _.Decode(utf8json: System.ReadOnlyMemory<byte>): 'T = serdes.Deserialize<'T>(utf8json)
99

1010
namespace FsCodec.NewtonsoftJson
1111

src/FsCodec.NewtonsoftJson/Options.fs

+11-11
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ open System.Runtime.InteropServices
99
type Options private () =
1010

1111
/// <summary>Analogous to <c>System.Text.Json</c>'s <c>JsonSerializerOptions.Default</c> - allows for sharing/caching of the default profile as defined by <c>Options.Create()</c></summary>
12-
static member val Default : JsonSerializerSettings = Options.Create()
12+
static member val Default: JsonSerializerSettings = Options.Create()
1313

1414
/// Creates a default set of serializer settings used by Json serialization. When used with no args, same as JsonSerializerSettings.CreateDefault()
1515
/// With one difference - it inhibits the JSON.NET out of the box parsing of strings that look like dates (see https://github.com/JamesNK/Newtonsoft.Json/issues/862)
1616
static member CreateDefault
17-
( [<Optional; ParamArray>] converters : JsonConverter[],
17+
( [<Optional; ParamArray>] converters: JsonConverter[],
1818
// Use multi-line, indented formatting when serializing JSON; defaults to false.
19-
[<Optional; DefaultParameterValue(null)>] ?indent : bool,
19+
[<Optional; DefaultParameterValue(null)>] ?indent: bool,
2020
// Render idiomatic camelCase for PascalCase items by using `CamelCasePropertyNamesContractResolver`. Defaults to false.
21-
[<Optional; DefaultParameterValue(null)>] ?camelCase : bool,
21+
[<Optional; DefaultParameterValue(null)>] ?camelCase: bool,
2222
// Ignore null values in input data; defaults to false.
23-
[<Optional; DefaultParameterValue(null)>] ?ignoreNulls : bool,
23+
[<Optional; DefaultParameterValue(null)>] ?ignoreNulls: bool,
2424
// Error on missing values (as opposed to letting them just be default-initialized); defaults to false.
25-
[<Optional; DefaultParameterValue(null)>] ?errorOnMissing : bool) =
25+
[<Optional; DefaultParameterValue(null)>] ?errorOnMissing: bool) =
2626
let indent = defaultArg indent false
2727
let camelCase = defaultArg camelCase false
2828
let ignoreNulls = defaultArg ignoreNulls false
@@ -42,16 +42,16 @@ type Options private () =
4242
/// - everything else is as per CreateDefault:- i.e. emit nulls instead of omitting fields etc
4343
static member Create
4444
( // List of converters to apply. An implicit OptionConverter() will be prepended and/or be used as a default
45-
[<Optional; ParamArray>] converters : JsonConverter[],
45+
[<Optional; ParamArray>] converters: JsonConverter[],
4646
// Use multi-line, indented formatting when serializing JSON; defaults to false.
47-
[<Optional; DefaultParameterValue(null)>] ?indent : bool,
47+
[<Optional; DefaultParameterValue(null)>] ?indent: bool,
4848
// Render idiomatic camelCase for PascalCase items by using `CamelCasePropertyNamesContractResolver`.
4949
// Defaults to false on basis that you'll use record and tuple field names that are camelCase (and hence not `CLSCompliant`).
50-
[<Optional; DefaultParameterValue(null)>] ?camelCase : bool,
50+
[<Optional; DefaultParameterValue(null)>] ?camelCase: bool,
5151
// Ignore null values in input data; defaults to `false`.
52-
[<Optional; DefaultParameterValue(null)>] ?ignoreNulls : bool,
52+
[<Optional; DefaultParameterValue(null)>] ?ignoreNulls: bool,
5353
// Error on missing values (as opposed to letting them just be default-initialized); defaults to false
54-
[<Optional; DefaultParameterValue(null)>] ?errorOnMissing : bool) =
54+
[<Optional; DefaultParameterValue(null)>] ?errorOnMissing: bool) =
5555
Options.CreateDefault(
5656
converters = [| OptionConverter()
5757
match converters with null -> () | xs -> yield! xs |],

src/FsCodec.NewtonsoftJson/Pickler.fs

+10-17
Original file line numberDiff line numberDiff line change
@@ -14,52 +14,45 @@ type JsonPickler<'T>() =
1414
inherit JsonConverter()
1515

1616
static let isMatchingType =
17-
let rec isMatching (ts : Type list) =
18-
match ts with
17+
let rec isMatching = function
1918
| [] -> false
2019
| t :: _ when t = typeof<'T> -> true
2120
| t :: tl ->
2221
let tail =
2322
[ match t.BaseType with null -> () | bt -> yield bt
2423
yield! t.GetInterfaces()
2524
yield! tl ]
26-
2725
isMatching tail
28-
2926
memoize (fun t -> isMatching [t])
3027

31-
abstract Write : writer: JsonWriter * serializer: JsonSerializer * source: 'T -> unit
32-
abstract Read : reader: JsonReader * serializer: JsonSerializer -> 'T
28+
abstract Write: writer: JsonWriter * serializer: JsonSerializer * source: 'T -> unit
29+
abstract Read: reader: JsonReader * serializer: JsonSerializer -> 'T
3330

3431
override _.CanConvert t = isMatchingType t
35-
3632
override _.CanRead = true
3733
override _.CanWrite = true
3834

39-
override x.WriteJson(writer : JsonWriter, value : obj, serializer : JsonSerializer) =
35+
override x.WriteJson(writer: JsonWriter, value: obj, serializer: JsonSerializer) =
4036
x.Write(writer, serializer, value :?> 'T)
41-
42-
override x.ReadJson(reader : JsonReader, _ : Type, _ : obj, serializer : JsonSerializer) =
37+
override x.ReadJson(reader: JsonReader, _objectType, _existingValue: obj, serializer: JsonSerializer) =
4338
x.Read(reader, serializer) :> obj
4439

4540
/// Json Converter that serializes based on an isomorphic type
4641
[<AbstractClass>]
47-
type JsonIsomorphism<'T, 'U>(?targetPickler : JsonPickler<'U>) =
42+
type JsonIsomorphism<'T, 'U>(?targetPickler: JsonPickler<'U>) =
4843
inherit JsonPickler<'T>()
4944

50-
abstract Pickle : 'T -> 'U
51-
abstract UnPickle : 'U -> 'T
45+
abstract Pickle: 'T -> 'U
46+
abstract UnPickle: 'U -> 'T
5247

53-
override x.Write(writer : JsonWriter, serializer : JsonSerializer, source : 'T) =
48+
override x.Write(writer: JsonWriter, serializer: JsonSerializer, source: 'T) =
5449
let target = x.Pickle source
5550
match targetPickler with
5651
| None -> serializer.Serialize(writer, target, typeof<'U>)
5752
| Some p -> p.Write(writer, serializer, target)
58-
59-
override x.Read(reader : JsonReader, serializer : JsonSerializer) =
53+
override x.Read(reader: JsonReader, serializer: JsonSerializer) =
6054
let target =
6155
match targetPickler with
6256
| None -> serializer.Deserialize<'U>(reader)
6357
| Some p -> p.Read(reader, serializer)
64-
6558
x.UnPickle target

src/FsCodec.NewtonsoftJson/Serdes.fs

+20-20
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ module private CharBuffersPool =
1717
module private Utf8BytesEncoder =
1818
let private streamManager = Microsoft.IO.RecyclableMemoryStreamManager()
1919
let rentStream () = streamManager.GetStream("bytesEncoder")
20-
let wrapAsStream (utf8json : ReadOnlyMemory<byte>) =
20+
let wrapAsStream (utf8json: ReadOnlyMemory<byte>) =
2121
// This is the most efficient way of approaching this without using Spans etc.
2222
// RecyclableMemoryStreamManager does not have any wins to provide us
2323
new MemoryStream(utf8json.ToArray(), writable = false)
24-
let makeJsonReader(ms : MemoryStream) =
24+
let makeJsonReader(ms: MemoryStream) =
2525
new JsonTextReader(new StreamReader(ms), ArrayPool = CharBuffersPool.instance)
2626
let private utf8NoBom = System.Text.UTF8Encoding(false, true)
2727
let makeJsonWriter ms =
@@ -30,59 +30,59 @@ module private Utf8BytesEncoder =
3030
new JsonTextWriter(sw, ArrayPool = CharBuffersPool.instance)
3131

3232
/// Serializes to/from strings using the supplied JsonSerializerSettings
33-
type Serdes(options : JsonSerializerSettings) =
33+
type Serdes(options: JsonSerializerSettings) =
3434

3535
// Cache serializer instance to avoid JsonConvert helpers creating one per call; see
3636
// https://github.com/JamesNK/Newtonsoft.Json/blob/4dc9af66e07dea321ad101bfb379326127251a80/Src/Newtonsoft.Json/JsonConvert.cs#L817
3737
let serializer = JsonSerializer.Create(options)
3838

3939
static let def = lazy Serdes Options.Default
4040
/// Cached shortcut for Serdes Options.Default
41-
static member Default : Serdes = def.Value
41+
static member Default: Serdes = def.Value
4242

4343
/// <summary>The <c>JsonSerializerSettings</c> used by this instance.</summary>
44-
member _.Options : JsonSerializerSettings = options
44+
member _.Options: JsonSerializerSettings = options
4545

4646
/// Serializes given value to a JSON string.
47-
member _.Serialize<'T>(value : 'T) : string =
47+
member _.Serialize<'T>(value: 'T): string =
4848
use sw = new StringWriter(System.Globalization.CultureInfo.InvariantCulture)
4949
use writer = new JsonTextWriter(sw)
5050
serializer.Serialize(writer, value)
5151
sw.ToString()
5252

5353
/// Serializes given value to a Byte Array, suitable for wrapping as a <c>ReadOnlyMemory</c>.
54-
member _.SerializeToUtf8(value : 'T) : byte[] =
54+
member _.SerializeToUtf8(value: 'T): byte[] =
5555
use ms = Utf8BytesEncoder.rentStream ()
5656
( use jsonWriter = Utf8BytesEncoder.makeJsonWriter ms
5757
serializer.Serialize(jsonWriter, value, typeof<'T>))
5858
// TOCONSIDER as noted in the comments on RecyclableMemoryStream.ToArray, ideally we'd be continuing the rental and passing out a Span
5959
ms.ToArray()
6060

61+
/// Serializes and writes given value to a stream.
62+
member _.SerializeToStream<'T>(value: 'T, utf8Stream: Stream) =
63+
// We're setting CloseOutput = false, because that's the default behavior in STJ
64+
// but also mostly because it's rude to close without asking
65+
use streamWriter = new StreamWriter(utf8Stream, System.Text.Encoding.UTF8, 128, leaveOpen = true)
66+
use writer = new JsonTextWriter(streamWriter, CloseOutput = false)
67+
serializer.Serialize(writer, value)
68+
streamWriter.Flush()
69+
6170
/// Deserializes value of given type from JSON string.
62-
member _.Deserialize<'T>(json : string) : 'T =
71+
member _.Deserialize<'T>(json: string): 'T =
6372
use reader = new JsonTextReader(new StringReader(json))
6473
serializer.Deserialize<'T>(reader)
6574

6675
/// Deserializes value of given type from a UTF8 JSON Buffer.
67-
member _.Deserialize<'T>(utf8json : ReadOnlyMemory<byte>) : 'T =
76+
member _.Deserialize<'T>(utf8json: ReadOnlyMemory<byte>): 'T =
6877
use ms = Utf8BytesEncoder.wrapAsStream utf8json
6978
use jsonReader = Utf8BytesEncoder.makeJsonReader ms
7079
serializer.Deserialize<'T>(jsonReader)
7180

7281
/// Deserializes value of given type from a JObject
73-
member _.Deserialize<'T>(parsed : Newtonsoft.Json.Linq.JObject) : 'T =
82+
member _.Deserialize<'T>(parsed: Newtonsoft.Json.Linq.JObject): 'T =
7483
parsed.ToObject(typeof<'T>, serializer) :?> 'T
7584

76-
/// Serializes and writes given value to a stream.
77-
member _.SerializeToStream<'T>(value : 'T, utf8Stream : Stream) =
78-
// We're setting CloseOutput = false, because that's the default behavior in STJ
79-
// but also mostly because it's rude to close without asking
80-
use streamWriter = new StreamWriter(utf8Stream, System.Text.Encoding.UTF8, 128, leaveOpen = true)
81-
use writer = new JsonTextWriter(streamWriter, CloseOutput = false)
82-
serializer.Serialize(writer, value)
83-
streamWriter.Flush()
84-
8585
/// Deserializes by reading from a stream.
86-
member _.DeserializeFromStream<'T>(utf8Stream : Stream) =
86+
member _.DeserializeFromStream<'T>(utf8Stream: Stream) =
8787
use reader = new JsonTextReader(new StreamReader(utf8Stream, System.Text.Encoding.UTF8))
8888
serializer.Deserialize<'T>(reader)

src/FsCodec.NewtonsoftJson/TypeSafeEnumConverter.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type TypeSafeEnumConverter() =
1515
let str = FsCodec.Union.caseNameT t value
1616
writer.WriteValue str
1717

18-
override _.ReadJson(reader : JsonReader, t: Type, _: obj, _: JsonSerializer) =
18+
override _.ReadJson(reader: JsonReader, t: Type, _: obj, _: JsonSerializer) =
1919
if reader.TokenType <> JsonToken.String then
2020
sprintf "Unexpected token when reading TypeSafeEnum: %O" reader.TokenType |> JsonSerializationException |> raise
2121
let str = reader.Value :?> string

src/FsCodec.NewtonsoftJson/UnionConverter.fs

+2-4
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ module private UnionInfo =
1313
t = typeof<string>
1414
|| t.IsValueType
1515
|| t.IsArray
16-
|| (t.IsGenericType
17-
&& (typedefof<Option<_>> = t.GetGenericTypeDefinition()
18-
|| t.GetGenericTypeDefinition().IsValueType)) // Nullable<T>
16+
|| (t.IsGenericType && let g = t.GetGenericTypeDefinition() in typedefof<Option<_>> = g || g.IsValueType) // Nullable<T>
1917

2018
let typeHasConverterAttribute = memoize (fun (t: Type) -> t.IsDefined(typeof<JsonConverterAttribute>))
2119
let typeIsUnionWithConverterAttribute = memoize (fun (t: Type) -> FsCodec.Union.isUnion t && typeHasConverterAttribute t)
@@ -26,7 +24,7 @@ module private UnionInfo =
2624

2725
/// Prepare arguments for the Case class ctor based on the kind of case and how F# maps that to a Type
2826
/// and/or whether we need to let json.net step in to convert argument types
29-
let mapTargetCaseArgs (inputJObject : JObject) serializer : PropertyInfo[] -> obj [] = function
27+
let mapTargetCaseArgs (inputJObject: JObject) serializer: PropertyInfo[] -> obj [] = function
3028
| [| singleCaseArg |] when propTypeRequiresConstruction singleCaseArg.PropertyType ->
3129
[| inputJObject.ToObject(singleCaseArg.PropertyType, serializer) |]
3230
| multipleFieldsInCustomCaseType ->

0 commit comments

Comments
 (0)