From 1f20c6e575f6d0963c42ea19b5cad543b4574313 Mon Sep 17 00:00:00 2001 From: Nicolas Perriault Date: Thu, 26 Sep 2024 12:14:32 +0200 Subject: [PATCH] chore: decode object examples, introduce Query. --- bin/build-db | 1 + src/Data/Object/Db.elm | 15 +++++++++++---- src/Data/Object/Process.elm | 24 +++++++++++++++++++---- src/Data/Object/Query.elm | 37 ++++++++++++++++++++++++++++++++++++ src/Static/Json.elm-template | 7 ++++++- 5 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 src/Data/Object/Query.elm diff --git a/bin/build-db b/bin/build-db index d2482851e..f67223dab 100755 --- a/bin/build-db +++ b/bin/build-db @@ -63,6 +63,7 @@ const elmWithFixtures = elmTemplate ) .replace("%foodProductExamplesJson%", parseAndValidate("public/data/food/examples.json", "id")) // Object JSON data + .replace("%objectExamplesJson%", parseAndValidate("public/data/object/examples.json", "id")) .replace( "%objectProcessesJson%", parseAndValidate( diff --git a/src/Data/Object/Db.elm b/src/Data/Object/Db.elm index 0abe7fe4b..641137d82 100644 --- a/src/Data/Object/Db.elm +++ b/src/Data/Object/Db.elm @@ -3,24 +3,31 @@ module Data.Object.Db exposing , buildFromJson ) +import Data.Example as Example exposing (Example) import Data.Impact as Impact import Data.Object.Process as Process exposing (Process) +import Data.Object.Query as Query exposing (Query) import Json.Decode as Decode import Result.Extra as RE type alias Db = - { processes : List Process } + { examples : List (Example Query) + , processes : List Process + } -buildFromJson : String -> Result String Db -buildFromJson objectProcessesJson = +buildFromJson : String -> String -> Result String Db +buildFromJson objectExamplesJson objectProcessesJson = objectProcessesJson |> Decode.decodeString (Process.decodeList Impact.decodeImpacts) |> Result.mapError Decode.errorToString |> Result.andThen (\processes -> Ok Db - -- FIXME: add more stuff to Db, eg. examples + |> RE.andMap + (objectExamplesJson + |> Example.decodeListFromJsonString Query.decode + ) |> RE.andMap (Ok processes) ) diff --git a/src/Data/Object/Process.elm b/src/Data/Object/Process.elm index 5c7654e0e..32949eab8 100644 --- a/src/Data/Object/Process.elm +++ b/src/Data/Object/Process.elm @@ -1,5 +1,7 @@ module Data.Object.Process exposing - ( Process + ( Id + , Process + , decodeId , decodeList , encode ) @@ -11,11 +13,15 @@ import Json.Decode.Pipeline as Pipe import Json.Encode as Encode +type Id + = Id Uuid + + type alias Process = { comment : String , density : Float , displayName : String - , id : Uuid + , id : Id , impacts : Impacts , name : String , source : String @@ -29,13 +35,18 @@ decodeProcess impactsDecoder = |> Pipe.required "comment" Decode.string |> Pipe.required "density" Decode.float |> Pipe.required "display_name" Decode.string - |> Pipe.required "id" Uuid.decoder + |> Pipe.required "id" decodeId |> Pipe.required "impacts" impactsDecoder |> Pipe.required "name" Decode.string |> Pipe.required "source" Decode.string |> Pipe.required "unit" Decode.string +decodeId : Decoder Id +decodeId = + Decode.map Id Uuid.decoder + + decodeList : Decoder Impact.Impacts -> Decoder (List Process) decodeList impactsDecoder = Decode.list (decodeProcess impactsDecoder) @@ -47,9 +58,14 @@ encode process = [ ( "comment", Encode.string process.comment ) , ( "density", Encode.float process.density ) , ( "displayName", Encode.string process.displayName ) - , ( "id", Uuid.encoder process.id ) + , ( "id", encodeId process.id ) , ( "impacts", Impact.encode process.impacts ) , ( "name", Encode.string process.name ) , ( "source", Encode.string process.source ) , ( "unit", Encode.string process.unit ) ] + + +encodeId : Id -> Encode.Value +encodeId (Id uuid) = + Uuid.encoder uuid diff --git a/src/Data/Object/Query.elm b/src/Data/Object/Query.elm new file mode 100644 index 000000000..690e3b01e --- /dev/null +++ b/src/Data/Object/Query.elm @@ -0,0 +1,37 @@ +module Data.Object.Query exposing + ( Amount + , Item + , Query + , decode + ) + +import Data.Object.Process as Process +import Json.Decode as Decode exposing (Decoder) + + +type alias Query = + { items : List Item + } + + +type alias Item = + { amount : Amount + , processId : Process.Id + } + + +type Amount + = Amount Float + + +decode : Decoder Query +decode = + Decode.map Query + (Decode.field "processes" (Decode.list decodeItem)) + + +decodeItem : Decoder Item +decodeItem = + Decode.map2 Item + (Decode.field "amount" (Decode.map Amount Decode.float)) + (Decode.field "process_id" Process.decodeId) diff --git a/src/Static/Json.elm-template b/src/Static/Json.elm-template index 1cc345fbe..c7e16b7be 100644 --- a/src/Static/Json.elm-template +++ b/src/Static/Json.elm-template @@ -86,6 +86,11 @@ transportsJson = """%transportsJson%""" +objectExamplesJson : String +objectExamplesJson = + """%objectExamplesJson%""" + + objectProcessesJson : String objectProcessesJson = """%objectProcessesJson%""" @@ -93,7 +98,7 @@ objectProcessesJson = objectDb : String -> Result String ObjectDb.Db objectDb objectProcesses = - ObjectDb.buildFromJson objectProcesses + ObjectDb.buildFromJson objectExamplesJson objectProcesses rawJsonProcesses : RawJsonProcesses