Skip to content

Commit

Permalink
finish moving template json ✨
Browse files Browse the repository at this point in the history
  • Loading branch information
Freymaurer committed Mar 25, 2024
1 parent c25748a commit 39fe3cf
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 114 deletions.
1 change: 0 additions & 1 deletion src/ARCtrl/ARCtrl.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
<Compile Include="Contracts\Contracts.Git.fs" />
<Compile Include="Contracts\Contracts.ARCtrl.fs" />
<Compile Include="Templates\Templates.fs" />
<Compile Include="Templates\Template.Json.fs" />
<Compile Include="Templates\Template.Spreadsheet.fs" />
<Compile Include="Templates\Template.Web.fs" />
<Compile Include="ARC.fs" />
Expand Down
105 changes: 0 additions & 105 deletions src/ARCtrl/Templates/Template.Json.fs

This file was deleted.

16 changes: 8 additions & 8 deletions src/Core/Template.fs
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ type Organisation =
member this.IsOfficial() = this = DataPLANT

[<AttachMembers>]
type Template(id: System.Guid, table: ArcTable, ?name: string, ?description, ?organisation: Organisation, ?version: string, ?authors: Person [],
?repos: OntologyAnnotation [], ?tags: OntologyAnnotation [], ?lastUpdated: System.DateTime) =
type Template(id: System.Guid, table: ArcTable, ?name: string, ?description, ?organisation: Organisation, ?version: string, ?authors: ResizeArray<Person>,
?repos: ResizeArray<OntologyAnnotation>, ?tags: ResizeArray<OntologyAnnotation>, ?lastUpdated: System.DateTime) =

let name = defaultArg name ""
let description = defaultArg description ""
let organisation = defaultArg organisation (Other "Custom Organisation")
let version = defaultArg version "0.0.0"
let authors = defaultArg authors [||]
let repos = defaultArg repos [||]
let tags = defaultArg tags [||]
let authors = defaultArg authors <| ResizeArray()
let repos = defaultArg repos <| ResizeArray()
let tags = defaultArg tags <| ResizeArray()
let lastUpdated = defaultArg lastUpdated (System.DateTime.Now.ToUniversalTime())

member val Id : System.Guid = id with get, set
Expand All @@ -37,9 +37,9 @@ type Template(id: System.Guid, table: ArcTable, ?name: string, ?description, ?or
member val Description : string = description with get, set
member val Organisation : Organisation = organisation with get, set
member val Version : string = version with get, set
member val Authors : Person [] = authors with get, set
member val EndpointRepositories : OntologyAnnotation [] = repos with get, set
member val Tags : OntologyAnnotation [] = tags with get, set
member val Authors : ResizeArray<Person> = authors with get, set
member val EndpointRepositories : ResizeArray<OntologyAnnotation> = repos with get, set
member val Tags : ResizeArray<OntologyAnnotation> = tags with get, set
member val LastUpdated : System.DateTime = lastUpdated with get, set

static member make id table name description organisation version authors repos tags lastUpdated =
Expand Down
1 change: 1 addition & 0 deletions src/Json/ARCtrl.Json.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
<Compile Include="Table\CompositeHeader.fs" />
<Compile Include="Table\ArcTable.fs" />
<Compile Include="Table\Compression.fs" />
<Compile Include="Table\Templates.fs" />
<Compile Include="Assay.fs" />
<Compile Include="Study.fs" />
<Compile Include="Investigation.fs" />
Expand Down
128 changes: 128 additions & 0 deletions src/Json/Table/Templates.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
namespace ARCtrl.Json

open Thoth.Json.Core

open ARCtrl
open ARCtrl.Process
open ARCtrl.Helper
open Conversion

module Template =

module Organisation =

let encoder = (fun (org: Organisation) -> org.ToString()) >> Encode.string

let decoder =
Decode.string
|> Decode.andThen (fun textValue ->
Organisation.ofString textValue
|> Decode.succeed
)

let encoder (template: Template) =
Encode.object [
"id", Encode.guid template.Id
"table", ArcTable.encoder template.Table
"name", Encode.string template.Name
"description", Encode.string template.Description
"organisation", Organisation.encoder template.Organisation
"version", Encode.string template.Version
Encode.tryIncludeSeq "authors" Person.encoder template.Authors
Encode.tryIncludeSeq "endpoint_repositories" OntologyAnnotation.encoder template.EndpointRepositories
Encode.tryIncludeSeq "tags" OntologyAnnotation.encoder template.Tags
"last_updated", Encode.datetime template.LastUpdated
]

let decoder : Decoder<Template> =
Decode.object(fun get ->
Template.create(
get.Required.Field "id" Decode.guid,
get.Required.Field "table" ArcTable.decoder,
get.Required.Field "name" Decode.string,
get.Required.Field "description" Decode.string,
get.Required.Field "organisation" Organisation.decoder,
get.Required.Field "version" Decode.string,
?authors = get.Optional.Field "authors" (Decode.resizeArray Person.decoder),
?repos = get.Optional.Field "endpoint_repositories" (Decode.resizeArray OntologyAnnotation.decoder),
?tags = get.Optional.Field "tags" (Decode.resizeArray OntologyAnnotation.decoder),
#if FABLE_COMPILER_PYTHON
?lastUpdated = get.Required.Field "last_updated" Decode.datetimeLocal // Currently not supported in Thoth.Json.Core for python
#else
lastUpdated = get.Required.Field "last_updated" Decode.datetimeUtc
#endif
)
)

let encoderCompressed stringTable oaTable cellTable (template: Template) =
Encode.object [
"id", Encode.guid template.Id
"table", ArcTable.encoderCompressed stringTable oaTable cellTable template.Table
"name", Encode.string template.Name
"description", Encode.string template.Description
"organisation", Organisation.encoder template.Organisation
"version", Encode.string template.Version
Encode.tryIncludeSeq "authors" Person.encoder template.Authors
Encode.tryIncludeSeq "endpoint_repositories" OntologyAnnotation.encoder template.EndpointRepositories
Encode.tryIncludeSeq "tags" OntologyAnnotation.encoder template.Tags
"last_updated", Encode.datetime template.LastUpdated
]

let decoderCompressed stringTable oaTable cellTable : Decoder<Template> =
Decode.object(fun get ->
Template.create(
get.Required.Field "id" Decode.guid,
get.Required.Field "table" (ArcTable.decoderCompressed stringTable oaTable cellTable),
get.Required.Field "name" Decode.string,
get.Required.Field "description" Decode.string,
get.Required.Field "organisation" Organisation.decoder,
get.Required.Field "version" Decode.string,
?authors = get.Optional.Field "authors" (Decode.resizeArray Person.decoder),
?repos = get.Optional.Field "endpoint_repositories" (Decode.resizeArray OntologyAnnotation.decoder),
?tags = get.Optional.Field "tags" (Decode.resizeArray OntologyAnnotation.decoder),
#if FABLE_COMPILER_PYTHON
?lastUpdated = get.Required.Field "last_updated" Decode.datetimeLocal // Currently not supported in Thoth.Json.Core for python
#else
lastUpdated = get.Required.Field "last_updated" Decode.datetimeUtc
#endif
)
)

module Templates =

let encoder (templates: Template []) =
templates
|> Array.map (Template.encoder)
|> Encode.array

let decoder =
Decode.array Template.decoder

let fromJsonString (jsonString: string) =
try Decode.fromJsonString decoder jsonString with
| exn -> failwithf "Error. Given json string cannot be parsed to Templates map: %A" exn

let toJsonString (spaces: int) (templates: Template []) =
Encode.toJsonString spaces (encoder templates)

[<AutoOpen>]
module TemplateExtension =

type Template with

static member fromJsonString (jsonString: string) =
try Decode.fromJsonString Template.decoder jsonString with
| exn -> failwithf "Error. Given json string cannot be parsed to Template: %A" exn

static member toJsonString(?spaces: int) =
fun (template:Template) ->
Encode.toJsonString (Encode.defaultSpaces spaces) (Template.encoder template)

static member fromCompressedJsonString (s: string) =
try Decode.fromJsonString (Compression.decode Template.decoderCompressed) s with
| e -> failwithf "Error. Unable to parse json string to ArcStudy: %s" e.Message

static member toCompressedJsonString(?spaces) =
fun (obj:Template) ->
let spaces = defaultArg spaces 0
Encode.toJsonString spaces (Compression.encode Template.encoderCompressed obj)

0 comments on commit 39fe3cf

Please sign in to comment.