aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/program
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/program')
-rw-r--r--stdlib/source/program/aedifex/artifact/snapshot/version.lux71
1 files changed, 71 insertions, 0 deletions
diff --git a/stdlib/source/program/aedifex/artifact/snapshot/version.lux b/stdlib/source/program/aedifex/artifact/snapshot/version.lux
new file mode 100644
index 000000000..905523bd0
--- /dev/null
+++ b/stdlib/source/program/aedifex/artifact/snapshot/version.lux
@@ -0,0 +1,71 @@
+(.module:
+ [lux (#- Type)
+ [abstract
+ [equivalence (#+ Equivalence)]
+ [monad (#+ do)]]
+ [control
+ ["<>" parser
+ ["<.>" xml (#+ Parser)]
+ ["<.>" text]]]
+ [data
+ ["." product]
+ ["." text]
+ [format
+ ["." xml (#+ XML)]]]]
+ ["." /// #_
+ ["#." type (#+ Type)]
+ ["#." time (#+ Time)]])
+
+(type: #export Version
+ {#extension Type
+ #value Text
+ #updated Time})
+
+(def: #export equivalence
+ (Equivalence Version)
+ ($_ product.equivalence
+ text.equivalence
+ text.equivalence
+ ///time.equivalence
+ ))
+
+(template [<definition> <tag>]
+ [(def: <definition> xml.Tag ["" <tag>])]
+
+ [<extension> "extension"]
+ [<value> "value"]
+ [<updated> "updated"]
+
+ [<snapshot_version> "snapshotVersion"]
+ )
+
+(def: (format_text tag value)
+ (-> xml.Tag Text XML)
+ (|> value #xml.Text list (#xml.Node tag xml.attributes)))
+
+(def: #export (format (^slots [#extension #value #updated]))
+ (-> Version XML)
+ (<| (#xml.Node ..<snapshot_version> xml.attributes)
+ (list (..format_text ..<extension> extension)
+ (..format_text ..<value> value)
+ (..format_text ..<updated> (///time.format updated)))))
+
+(def: (sub tag parser)
+ (All [a] (-> xml.Tag (Parser a) (Parser a)))
+ (do <>.monad
+ [_ (<xml>.node tag)]
+ (<xml>.children parser)))
+
+(def: (text tag)
+ (-> xml.Tag (Parser Text))
+ (..sub tag <xml>.text))
+
+(def: #export parser
+ (Parser Version)
+ (<| (..sub ..<snapshot_version>)
+ ($_ <>.and
+ (<xml>.somewhere (..text ..<extension>))
+ (<xml>.somewhere (..text ..<value>))
+ (<xml>.somewhere (<text>.embed ///time.parser
+ (..text ..<updated>)))
+ )))