Skip to content

Switch Equinox.Cosmos over to System.Text.Json #200

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Mar 3, 2020
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion samples/Store/Domain/Domain.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<PackageReference Include="FSharp.Core" Version="3.1.2.5" Condition=" '$(TargetFramework)' == 'net461' " />
<PackageReference Include="FSharp.Core" Version="4.3.4" Condition=" '$(TargetFramework)' == 'netstandard2.0' " />

<PackageReference Include="FsCodec.NewtonsoftJson" Version="2.0.0" />
<PackageReference Include="FsCodec.NewtonsoftJson" Version="2.0.1" />
</ItemGroup>

<ItemGroup>
Expand Down
26 changes: 24 additions & 2 deletions samples/Tutorial/Gapless.fs
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,31 @@ let [<Literal>] appName = "equinox-tutorial-gapless"
module Cosmos =

open Equinox.Cosmos
open Equinox.Cosmos.Json
open System.Text.Json

module Codec =
open Events

let encode (evt: Event) =
match evt with
| Reserved item -> "Reserved", JsonSerializer.SerializeToElement(item, JsonSerializer.defaultOptions)
| Confirmed item -> "Confirmed", JsonSerializer.SerializeToElement(item, JsonSerializer.defaultOptions)
| Released item -> "Released", JsonSerializer.SerializeToElement(item, JsonSerializer.defaultOptions)
| Snapshotted snapshot -> "Snapshotted", JsonSerializer.SerializeToElement(snapshot, JsonSerializer.defaultOptions)

let tryDecode (eventType, data: JsonElement) =
match eventType with
| "Reserved" -> Some (Reserved <| JsonSerializer.DeserializeElement<Item>(data))
| "Confirmed" -> Some (Confirmed <| JsonSerializer.DeserializeElement<Item>(data))
| "Released" -> Some (Released <| JsonSerializer.DeserializeElement<Item>(data))
| "Snapshotted" -> Some (Snapshotted <| JsonSerializer.DeserializeElement<Snapshotted>(data))
| _ -> None

let private createService (context,cache,accessStrategy) =
let cacheStrategy = CachingStrategy.SlidingWindow (cache, TimeSpan.FromMinutes 20.) // OR CachingStrategy.NoCaching
let resolve = Resolver(context, Events.codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
let codec = FsCodec.Codec.Create<Events.Event, JsonElement>(Codec.encode, Codec.tryDecode)
let resolve = Resolver(context, codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
Service(Serilog.Log.Logger, resolve)

module Snapshot =
Expand All @@ -94,4 +116,4 @@ module Cosmos =

let createService (context,cache) =
let accessStrategy = AccessStrategy.RollingState Fold.snapshot
createService(context,cache,accessStrategy)
createService(context,cache,accessStrategy)
24 changes: 22 additions & 2 deletions samples/Tutorial/Index.fs
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,34 @@ let create resolve indexId = Service(indexId, resolve, maxAttempts = 3)
module Cosmos =

open Equinox.Cosmos
open Equinox.Cosmos.Json
open System.Text.Json

module Codec =
open Events

let encode<'v> (evt: Event<'v>) =
match evt with
| Added items -> "Added", JsonSerializer.SerializeToElement(items, JsonSerializer.defaultOptions)
| Deleted itemIds -> "Deleted", JsonSerializer.SerializeToElement(itemIds, JsonSerializer.defaultOptions)
| Snapshotted items -> "Snapshotted", JsonSerializer.SerializeToElement(items, JsonSerializer.defaultOptions)

let tryDecode<'v> (eventType, data: JsonElement) =
match eventType with
| "Added" -> Some (Added <| JsonSerializer.DeserializeElement<Items<'v>>(data))
| "Deleted" -> Some (Deleted <| JsonSerializer.DeserializeElement<ItemIds>(data))
| "Snapshotted" -> Some (Snapshotted <| JsonSerializer.DeserializeElement<Items<'v>>(data))
| _ -> None

let createService<'v> (context,cache) =
let cacheStrategy = CachingStrategy.SlidingWindow (cache, System.TimeSpan.FromMinutes 20.)
let accessStrategy = AccessStrategy.RollingState Fold.snapshot
let resolve = Resolver(context, Events.codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
let codec = FsCodec.Codec.Create<Events.Event<'v>, JsonElement>(Codec.encode<'v>, Codec.tryDecode<'v>)
let resolve = Resolver(context, codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
create resolve

module MemoryStore =

let createService store =
let resolve = Equinox.MemoryStore.Resolver(store, Events.codec, Fold.fold, Fold.initial).Resolve
create resolve
create resolve
18 changes: 17 additions & 1 deletion samples/Tutorial/Sequence.fs
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,25 @@ let create resolve = Service(Serilog.Log.ForContext<Service>(), resolve, maxAtte
module Cosmos =

open Equinox.Cosmos
open Equinox.Cosmos.Json
open System.Text.Json

module Codec =
open Events

let encode (evt: Event) =
match evt with
| Reserved reserved -> "Reserved", JsonSerializer.SerializeToElement(reserved, JsonSerializer.defaultOptions)

let tryDecode (eventType, data: JsonElement) =
match eventType with
| "Reserved" -> Some (Reserved <| JsonSerializer.DeserializeElement<Reserved>(data))
| _ -> None

let private createService (context,cache,accessStrategy) =
let cacheStrategy = CachingStrategy.SlidingWindow (cache, TimeSpan.FromMinutes 20.) // OR CachingStrategy.NoCaching
let resolve = Resolver(context, Events.codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
let codec = FsCodec.Codec.Create<Events.Event, JsonElement>(Codec.encode, Codec.tryDecode)
let resolve = Resolver(context, codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
create resolve

module LatestKnownEvent =
Expand Down
24 changes: 22 additions & 2 deletions samples/Tutorial/Set.fs
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,34 @@ let create resolve setId = Service(Serilog.Log.ForContext<Service>(), setId, res
module Cosmos =

open Equinox.Cosmos
open Equinox.Cosmos.Json
open System.Text.Json

module Codec =
open Events

let encode (evt: Event) =
match evt with
| Added items -> "Added", JsonSerializer.SerializeToElement(items, JsonSerializer.defaultOptions)
| Deleted items -> "Deleted", JsonSerializer.SerializeToElement(items, JsonSerializer.defaultOptions)
| Snapshotted items -> "Snapshotted", JsonSerializer.SerializeToElement(items, JsonSerializer.defaultOptions)

let tryDecode (eventType, data: JsonElement) =
match eventType with
| "Added" -> Some (Added <| JsonSerializer.DeserializeElement<Items>(data))
| "Deleted" -> Some (Deleted <| JsonSerializer.DeserializeElement<Items>(data))
| "Snapshotted" -> Some (Snapshotted <| JsonSerializer.DeserializeElement<Items>(data))
| _ -> None

let createService (context,cache) =
let cacheStrategy = CachingStrategy.SlidingWindow (cache, System.TimeSpan.FromMinutes 20.)
let accessStrategy = AccessStrategy.RollingState Fold.snapshot
let resolve = Resolver(context, Events.codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
let codec = FsCodec.Codec.Create<Events.Event, JsonElement>(Codec.encode, Codec.tryDecode)
let resolve = Resolver(context, codec, Fold.fold, Fold.initial, cacheStrategy, accessStrategy).Resolve
create resolve

module MemoryStore =

let createService store =
let resolve = Equinox.MemoryStore.Resolver(store, Events.codec, Fold.fold, Fold.initial).Resolve
create resolve
create resolve
18 changes: 17 additions & 1 deletion samples/Tutorial/Upload.fs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,25 @@ let create resolve = Service(Serilog.Log.ForContext<Service>(), resolve, 3)
module Cosmos =

open Equinox.Cosmos
open Equinox.Cosmos.Json
open System.Text.Json

module Codec =
open Events

let encode (evt: Event) =
match evt with
| IdAssigned id -> "IdAssigned", JsonSerializer.SerializeToElement(id, JsonSerializer.defaultOptions)

let tryDecode (eventType, data: JsonElement) =
match eventType with
| "IdAssigned" -> Some (IdAssigned <| JsonSerializer.DeserializeElement<IdAssigned>(data))
| _ -> None

let createService (context,cache) =
let cacheStrategy = CachingStrategy.SlidingWindow (cache, TimeSpan.FromMinutes 20.) // OR CachingStrategy.NoCaching
let resolve = Resolver(context, Events.codec, Fold.fold, Fold.initial, cacheStrategy, AccessStrategy.LatestKnownEvent).Resolve
let codec = FsCodec.Codec.Create<Events.Event, JsonElement>(Codec.encode, Codec.tryDecode)
let resolve = Resolver(context, codec, Fold.fold, Fold.initial, cacheStrategy, AccessStrategy.LatestKnownEvent).Resolve
create resolve

module EventStore =
Expand Down
4 changes: 4 additions & 0 deletions src/Equinox.Core/Infrastructure.fs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ type Async with
sc ())
|> ignore)

#if NETSTANDARD2_1
static member inline AwaitValueTask (vtask: ValueTask<'T>) : Async<'T> = vtask.AsTask() |> Async.AwaitTaskCorrect
#endif

[<RequireQualifiedAccess>]
module Regex =
open System.Text.RegularExpressions
Expand Down
Loading