Safe Haskell | None |
---|---|
Language | Haskell2010 |
Dhall.DirectoryTree
Description
Implementation of the dhall to-directory-tree
subcommand
Synopsis
- toDirectoryTree :: Bool -> FilePath -> Expr Void Void -> IO ()
- newtype FilesystemError = FilesystemError {}
- data Mode (f :: Type -> Type) = Mode {}
- setFileMode :: FilePath -> FileMode -> IO ()
- data Group
- data User
- data FilesystemEntry
- = DirectoryEntry (Entry (Seq FilesystemEntry))
- | FileEntry (Entry Text)
- type DirectoryEntry = Entry (Seq FilesystemEntry)
- type FileEntry = Entry Text
- data Entry a = Entry {}
- data Access (f :: Type -> Type) = Access {
- accessExecute :: f Bool
- accessRead :: f Bool
- accessWrite :: f Bool
- prettyFileMode :: FileMode -> String
- isMetadataSupported :: Bool
- decodeDirectoryTree :: Expr s Void -> IO (Seq FilesystemEntry)
- directoryTreeType :: Expector (Expr Src Void)
Filesystem
Arguments
:: Bool | Whether to allow path separators in file names or not |
-> FilePath | |
-> Expr Void Void | |
-> IO () |
Attempt to transform a Dhall record into a directory tree where:
- Records are translated into directories
Map
s are also translated into directoriesText
values or fields are translated into filesOptional
values are omitted ifNone
- There 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 Goodbye
Use 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 tree
The 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.
newtype FilesystemError #
This error indicates that you supplied an invalid Dhall expression to the
toDirectoryTree
function. The Dhall expression could not be translated
to a directory tree.
Constructors
FilesystemError | |
Fields |
Instances
Exception FilesystemError # | |
Defined in Dhall.DirectoryTree Methods toException :: FilesystemError -> SomeException # | |
Show FilesystemError # | |
Defined in Dhall.DirectoryTree Methods showsPrec :: Int -> FilesystemError -> ShowS # show :: FilesystemError -> String # showList :: [FilesystemError] -> ShowS # |
Low-level types and functions
data Mode (f :: Type -> Type) #
A filesystem mode. See chmod(1).
The parameter is meant to be instantiated by either Identity
or Maybe
depending on the completeness of the information:
* For data read from the filesystem it will be Identity
.
* For user-supplied data it will be Maybe
as we want to be able to set
only specific bits.
Instances
setFileMode :: FilePath -> FileMode -> IO () #
A wrapper around setFileMode
. On Windows, it does check the
resulting file mode of the file/directory and emits a warning if it doesn't
match the desired file mode. On all other OS it is identical to
setFileMode
as it is assumed to work correctly.
A group identified either by id or name.
Instances
Generic Group # | |||||
Defined in Dhall.DirectoryTree.Types Associated Types
| |||||
Show Group # | |||||
FromDhall Group # | |||||
Defined in Dhall.DirectoryTree.Types Methods autoWith :: InputNormalizer -> Decoder Group # | |||||
Eq Group # | |||||
Ord Group # | |||||
type Rep Group # | |||||
Defined in Dhall.DirectoryTree.Types type Rep Group = D1 ('MetaData "Group" "Dhall.DirectoryTree.Types" "dhall-1.42.1-EOSVgq7D92c9LY0yY6dtAL" 'False) (C1 ('MetaCons "GroupId" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 GroupID)) :+: C1 ('MetaCons "GroupName" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String))) |
A user identified either by id or name.
Instances
Generic User # | |||||
Defined in Dhall.DirectoryTree.Types Associated Types
| |||||
Show User # | |||||
FromDhall User # | |||||
Defined in Dhall.DirectoryTree.Types Methods autoWith :: InputNormalizer -> Decoder User # | |||||
Eq User # | |||||
Ord User # | |||||
type Rep User # | |||||
Defined in Dhall.DirectoryTree.Types type Rep User = D1 ('MetaData "User" "Dhall.DirectoryTree.Types" "dhall-1.42.1-EOSVgq7D92c9LY0yY6dtAL" 'False) (C1 ('MetaCons "UserId" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 UserID)) :+: C1 ('MetaCons "UserName" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String))) |
data FilesystemEntry #
A filesystem entry.
Constructors
DirectoryEntry (Entry (Seq FilesystemEntry)) | |
FileEntry (Entry Text) |
Instances
Generic FilesystemEntry # | |||||
Defined in Dhall.DirectoryTree.Types Associated Types
Methods from :: FilesystemEntry -> Rep FilesystemEntry x # to :: Rep FilesystemEntry x -> FilesystemEntry # | |||||
Show FilesystemEntry # | |||||
Defined in Dhall.DirectoryTree.Types Methods showsPrec :: Int -> FilesystemEntry -> ShowS # show :: FilesystemEntry -> String # showList :: [FilesystemEntry] -> ShowS # | |||||
FromDhall FilesystemEntry # | |||||
Defined in Dhall.DirectoryTree.Types Methods | |||||
Eq FilesystemEntry # | |||||
Defined in Dhall.DirectoryTree.Types Methods (==) :: FilesystemEntry -> FilesystemEntry -> Bool # (/=) :: FilesystemEntry -> FilesystemEntry -> Bool # | |||||
Ord FilesystemEntry # | |||||
Defined in Dhall.DirectoryTree.Types Methods compare :: FilesystemEntry -> FilesystemEntry -> Ordering # (<) :: FilesystemEntry -> FilesystemEntry -> Bool # (<=) :: FilesystemEntry -> FilesystemEntry -> Bool # (>) :: FilesystemEntry -> FilesystemEntry -> Bool # (>=) :: FilesystemEntry -> FilesystemEntry -> Bool # max :: FilesystemEntry -> FilesystemEntry -> FilesystemEntry # min :: FilesystemEntry -> FilesystemEntry -> FilesystemEntry # | |||||
type Rep FilesystemEntry # | |||||
Defined in Dhall.DirectoryTree.Types type Rep FilesystemEntry = D1 ('MetaData "FilesystemEntry" "Dhall.DirectoryTree.Types" "dhall-1.42.1-EOSVgq7D92c9LY0yY6dtAL" 'False) (C1 ('MetaCons "DirectoryEntry" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Entry (Seq FilesystemEntry)))) :+: C1 ('MetaCons "FileEntry" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Entry Text)))) |
type DirectoryEntry = Entry (Seq FilesystemEntry) #
A directory in the filesystem.
A generic filesystem entry. This type holds the metadata that apply to all entries. It is parametric over the content of such an entry.
Constructors
Entry | |
Instances
Generic (Entry a) # | |||||
Defined in Dhall.DirectoryTree.Types Associated Types
| |||||
Show a => Show (Entry a) # | |||||
FromDhall a => FromDhall (Entry a) # | |||||
Defined in Dhall.DirectoryTree.Types Methods autoWith :: InputNormalizer -> Decoder (Entry a) # | |||||
Eq a => Eq (Entry a) # | |||||
Ord a => Ord (Entry a) # | |||||
Defined in Dhall.DirectoryTree.Types | |||||
type Rep (Entry a) # | |||||
Defined in Dhall.DirectoryTree.Types type Rep (Entry a) = D1 ('MetaData "Entry" "Dhall.DirectoryTree.Types" "dhall-1.42.1-EOSVgq7D92c9LY0yY6dtAL" 'False) (C1 ('MetaCons "Entry" 'PrefixI 'True) ((S1 ('MetaSel ('Just "entryName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String) :*: S1 ('MetaSel ('Just "entryContent") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)) :*: (S1 ('MetaSel ('Just "entryUser") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe User)) :*: (S1 ('MetaSel ('Just "entryGroup") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe Group)) :*: S1 ('MetaSel ('Just "entryMode") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Maybe (Mode Maybe))))))) |
data Access (f :: Type -> Type) #
The permissions for a subject (usergroupother).
Constructors
Access | |
Fields
|
Instances
Generic (Access f) # | |||||
Defined in Dhall.DirectoryTree.Types Associated Types
| |||||
Show (Access Identity) # | |||||
Show (Access Maybe) # | |||||
FromDhall (Access Identity) # | |||||
Defined in Dhall.DirectoryTree.Types | |||||
FromDhall (Access Maybe) # | |||||
Defined in Dhall.DirectoryTree.Types | |||||
Eq (Access Identity) # | |||||
Eq (Access Maybe) # | |||||
Ord (Access Identity) # | |||||
Defined in Dhall.DirectoryTree.Types Methods compare :: Access Identity -> Access Identity -> Ordering # (<) :: Access Identity -> Access Identity -> Bool # (<=) :: Access Identity -> Access Identity -> Bool # (>) :: Access Identity -> Access Identity -> Bool # (>=) :: Access Identity -> Access Identity -> Bool # max :: Access Identity -> Access Identity -> Access Identity # min :: Access Identity -> Access Identity -> Access Identity # | |||||
Ord (Access Maybe) # | |||||
Defined in Dhall.DirectoryTree.Types | |||||
type Rep (Access f) # | |||||
Defined in Dhall.DirectoryTree.Types type Rep (Access f) = D1 ('MetaData "Access" "Dhall.DirectoryTree.Types" "dhall-1.42.1-EOSVgq7D92c9LY0yY6dtAL" 'False) (C1 ('MetaCons "Access" 'PrefixI 'True) (S1 ('MetaSel ('Just "accessExecute") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (f Bool)) :*: (S1 ('MetaSel ('Just "accessRead") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (f Bool)) :*: S1 ('MetaSel ('Just "accessWrite") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (f Bool))))) |
prettyFileMode :: FileMode -> String #
Pretty-print a FileMode
. The format is similar to the one ls(1):
It is display as three blocks of three characters. The first block are the
permissions of the user, the second one are the ones of the group and the
third one the ones of other subjects. A r
denotes that the file or
directory is readable by the subject, a w
denotes that it is writable and
an x
denotes that it is executable. Unset permissions are represented by
-
.
Is setting metadata supported on this platform or not.
decodeDirectoryTree :: Expr s Void -> IO (Seq FilesystemEntry) #
Decode a fixpoint directory tree from a Dhall expression.