140 lines
5.6 KiB
Text
140 lines
5.6 KiB
Text
|
let Ini = ../ini/ini.dhall
|
||
|
|
||
|
let Lib = ../dhall/lib.dhall
|
||
|
|
||
|
in \(Ini/externs : Ini.Externs) ->
|
||
|
let Vdirsyncer =
|
||
|
let StorageType =
|
||
|
< FileSystem : { path : Text, fileext : < ICS > }
|
||
|
| Http : { url : Text }
|
||
|
>
|
||
|
|
||
|
let Collection = < FromA | FromB | Collection : Text >
|
||
|
|
||
|
let Collections =
|
||
|
< Unspecified | TheseCollections : List Collection >
|
||
|
|
||
|
let Storage = { storageName : Text, storage : StorageType }
|
||
|
|
||
|
in { Storage
|
||
|
, StorageType
|
||
|
, Collection
|
||
|
, Collections
|
||
|
, Pair =
|
||
|
{ pairName : Text
|
||
|
, a : Storage
|
||
|
, b : Storage
|
||
|
, collections : Collections
|
||
|
}
|
||
|
}
|
||
|
|
||
|
let toIniSections
|
||
|
: Vdirsyncer.Pair -> Ini.Sections
|
||
|
= \(pair : Vdirsyncer.Pair) ->
|
||
|
let
|
||
|
-- we assume the names are [a-zA-Z_]
|
||
|
renderList =
|
||
|
\(l : List Text) ->
|
||
|
"["
|
||
|
++ Lib.Text/concatMapSep
|
||
|
", "
|
||
|
Text
|
||
|
(\(t : Text) -> "\"${t}\"")
|
||
|
l
|
||
|
++ "]"
|
||
|
|
||
|
in let nv = \(name : Text) -> \(value : Text) -> { name, value }
|
||
|
|
||
|
let mkStorage =
|
||
|
\(storage : Vdirsyncer.Storage) ->
|
||
|
{ name = "storage ${storage.storageName}"
|
||
|
, value =
|
||
|
merge
|
||
|
{ FileSystem =
|
||
|
\ ( fs
|
||
|
: { path : Text, fileext : < ICS > }
|
||
|
) ->
|
||
|
[ nv "type" "filesystem"
|
||
|
, nv
|
||
|
"fileext"
|
||
|
(merge { ICS = ".ics" } fs.fileext)
|
||
|
, nv "path" fs.path
|
||
|
]
|
||
|
, Http =
|
||
|
\(http : { url : Text }) ->
|
||
|
[ nv "type" "http", nv "url" http.url ]
|
||
|
}
|
||
|
storage.storage
|
||
|
}
|
||
|
|
||
|
in [ { name = "pair ${pair.pairName}"
|
||
|
, value =
|
||
|
[ nv "a" pair.a.storageName
|
||
|
, nv "b" pair.b.storageName
|
||
|
, nv
|
||
|
"collections"
|
||
|
( merge
|
||
|
{ Unspecified = "none"
|
||
|
, TheseCollections =
|
||
|
\(colls : List Vdirsyncer.Collection) ->
|
||
|
renderList
|
||
|
( Lib.List/map
|
||
|
Vdirsyncer.Collection
|
||
|
Text
|
||
|
( \ ( coll
|
||
|
: Vdirsyncer.Collection
|
||
|
) ->
|
||
|
merge
|
||
|
{ FromA = "from a"
|
||
|
, FromB = "from b"
|
||
|
, Collection =
|
||
|
\(t : Text) -> t
|
||
|
}
|
||
|
coll
|
||
|
)
|
||
|
colls
|
||
|
)
|
||
|
}
|
||
|
pair.collections
|
||
|
)
|
||
|
]
|
||
|
}
|
||
|
, mkStorage pair.a
|
||
|
, mkStorage pair.b
|
||
|
]
|
||
|
|
||
|
in { example =
|
||
|
Ini/externs.renderIni
|
||
|
( Ini.appendInis
|
||
|
( Lib.List/map
|
||
|
Vdirsyncer.Pair
|
||
|
Ini.Ini
|
||
|
( \(pair : Vdirsyncer.Pair) ->
|
||
|
{ globalSection = [] : Ini.Section
|
||
|
, sections = toIniSections pair
|
||
|
}
|
||
|
)
|
||
|
( [ { pairName = "testPair"
|
||
|
, a =
|
||
|
{ storageName = "mystor"
|
||
|
, storage =
|
||
|
Vdirsyncer.StorageType.FileSystem
|
||
|
{ path = "./test-ics"
|
||
|
, fileext = < ICS >.ICS
|
||
|
}
|
||
|
}
|
||
|
, b =
|
||
|
{ storageName = "mystor"
|
||
|
, storage =
|
||
|
Vdirsyncer.StorageType.Http
|
||
|
{ url = "https://profpatsch.de" }
|
||
|
}
|
||
|
, collections = Vdirsyncer.Collections.Unspecified
|
||
|
}
|
||
|
]
|
||
|
: List Vdirsyncer.Pair
|
||
|
)
|
||
|
)
|
||
|
)
|
||
|
}
|