Repository F# setup
open Reified
open Reified.Refinements
open Reified.Result

DataDSL

Reified.DataDSL provides short names and the => and ?=> operators for data construction and editing.

Without opening Reified.DataDSL

This example declares nested data, omits an optional field, applies an atomic patch, and renders the result without opening Reified.DataDSL:

Verified
open Reified

let nickname : string option = None

let customer =
    Data.data [
        Data.assoc "name" "Ada"
        Data.optionalAssoc "nickname" nickname
        Data.assoc "deletedAt" Data.Null
        Data.assoc "address" (
            Data.data [
                Data.assoc "city" "Adelaide"
                Data.assoc "postcode" 5000
            ])
        Data.assoc "roles" [ "author" ]
    ]

let request =
    customer
    |> Data.patch [
        DataEdit.replace "address.postcode" 5001
        DataEdit.append "roles" "admin"
        DataEdit.remove "deletedAt"
    ]

Data.render request
// => "{ name: \"Ada\", address: { city: \"Adelaide\", postcode: 5001 }, roles: [\"author\", \"admin\"] }"
Requires & types
Requires: open Reified (packages: Reified.Data)
val nickname: string option
val customer: Data
val request: Data

For a single edit, apply the direct Data operation instead:

Verified
customer |> Data.replace "name" "Grace"
Requires & types
Requires: open Reified (packages: Reified.Data)

The same example with Reified.DataDSL

Verified
open Reified
open Reified.DataDSL

let customerViaDsl =
    data [
        "name" => "Ada"
        "nickname" ?=> nickname
        "deletedAt" => nil
        "address" => [ "city" => "Adelaide"; "postcode" => 5000 ]
        "roles" => [ "author" ]
    ]

let requestViaDsl =
    customerViaDsl
    |> Data.patch [
        replace "address.postcode" 5001
        append "roles" "admin"
        remove "deletedAt"
    ]
Requires & types
Requires: open Reified; open Reified.DataDSL (packages: Reified.Data)
val customerViaDsl: Data
val requestViaDsl: Data

Literal and edit mappings

Every DSL name maps to an explicit Reified.Data or DataEdit function; the complete DataDSL ↔ explicit API table, the matching names, and the case-generation names are in the DataDSL API reference.

set makes the final path contain the value, adding a missing final object field when necessary. replace requires the target to exist, so a misspelled or unexpectedly absent path fails. Data.tryMatch is always qualified because it is not part of the DSL.