toDirectoryTree Attempt to transform a Dhall record into a directory tree where:
Records are translated into directories
Maps are also translated into directoriesTextvalues or fields are translated into filesOptionalvalues are omitted ifNoneThere is a more advanced way to construct directory trees using a fixpoint encoding. See the documentation below on that.
For example, the following Dhall record:
{ dir = { `hello.txt` = "Hello\n" }
, `goodbye.txt`= Some "Goodbye\n"
, `missing.txt` = None Text
}... should translate to this directory tree:
$ tree result
result
├── dir
│ └── hello.txt
└── goodbye.txt
$ cat result/dir/hello.txt
Hello
$ cat result/goodbye.txt
GoodbyeUse this in conjunction with the Prelude's support for rendering JSON/YAML in "pure Dhall" so that you can generate files containing JSON. For example:
let JSON =
https://prelude.dhall-lang.org/v12.0.0/JSON/package.dhall sha256:843783d29e60b558c2de431ce1206ce34bdfde375fcf06de8ec5bf77092fdef7
in { `example.json` =
JSON.render (JSON.array [ JSON.number 1.0, JSON.bool True ])
, `example.yaml` =
JSON.renderYAML
(JSON.object (toMap { foo = JSON.string "Hello", bar = JSON.null }))
}... which would generate:
$ cat result/example.json
[ 1.0, true ]
$ cat result/example.yaml
! "bar": null
! "foo": "Hello"Advanced construction of directory trees
In addition to the ways described above using "simple" Dhall values to construct the directory tree there is one based on a fixpoint encoding. It works by passing a value of the following type to the interpreter:
let User = < UserId : Natural | UserName : Text >
let Group = < GroupId : Natural | GroupName : Text >
let Access =
{ execute : Optional Bool
, read : Optional Bool
, write : Optional Bool
}
let Mode =
{ user : Optional Access
, group : Optional Access
, other : Optional Access
}
let Entry =
\(content : Type) ->
{ name : Text
, content : content
, user : Optional User
, group : Optional Group
, mode : Optional Mode
}
in forall (tree : Type) ->
forall ( make
: { directory : Entry (List tree) -> tree
, file : Entry Text -> tree
}
) ->
List treeThe fact that the metadata for filesystem entries is modeled after the POSIX permission model comes with the unfortunate downside that it might not apply to other systems: There, changes to the metadata (user, group, permissions) might be a no-op and no warning will be issued. This is a leaking abstraction of the unix-compat package used internally.
NOTE: This utility does not take care of type-checking and normalizing the provided expression. This will raise a FilesystemError exception or a DhallErrors exception upon encountering an expression that cannot be converted as-is.