From ddcc768d9d2e798814989037a286df9951840bcd Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 12 Aug 2020 01:01:30 -0400 Subject: WIP: New build-tool named Aedifex (can read project descriptions). --- stdlib/source/program/aedifex.lux | 93 ++++++++++++++++++ stdlib/source/program/aedifex/dependency.lux | 14 +++ stdlib/source/program/aedifex/parser.lux | 140 +++++++++++++++++++++++++++ stdlib/source/program/aedifex/project.lux | 68 +++++++++++++ 4 files changed, 315 insertions(+) create mode 100644 stdlib/source/program/aedifex.lux create mode 100644 stdlib/source/program/aedifex/dependency.lux create mode 100644 stdlib/source/program/aedifex/parser.lux create mode 100644 stdlib/source/program/aedifex/project.lux (limited to 'stdlib/source/program') diff --git a/stdlib/source/program/aedifex.lux b/stdlib/source/program/aedifex.lux new file mode 100644 index 000000000..fd269f71f --- /dev/null +++ b/stdlib/source/program/aedifex.lux @@ -0,0 +1,93 @@ +(.module: + [lux (#- Name) + [abstract + [monad (#+ do)]] + [control + [pipe (#+ do>)] + ["." try (#+ Try)] + ["." io (#+ IO)] + [parser + ["." cli (#+ program:)] + ["" code]] + [security + ["!" capability]]] + [data + [binary (#+ Binary)] + ["." text + ["%" format (#+ format)] + ["." encoding]] + [format + ["." xml]]] + [tool + [compiler + [language + [lux + ["." syntax]]]]] + [world + ["." file (#+ Path)]]] + ["." / #_ + ["#" project] + ["#." parser] + ["#." pom]]) + +(def: (read-file! path) + (-> Path (IO (Try Binary))) + (do (try.with io.monad) + [project-file (!.use (:: file.system file) [path])] + (!.use (:: project-file content) []))) + +(def: (write-pom! path project) + (-> Path /.Project (IO (Try Any))) + (do (try.with io.monad) + [file (!.use (:: file.system file) [path])] + (|> project + /pom.project + (:: xml.codec encode) + encoding.to-utf8 + (!.use (:: file over-write))))) + +(def: (read-code source-code) + (-> Text (Try Code)) + (let [parse (syntax.parse "" + syntax.no-aliases + (text.size source-code)) + start (: Source + [["" 0 0] 0 source-code])] + (case (parse start) + (#.Left [end error]) + (#try.Failure error) + + (#.Right [end lux-code]) + (#try.Success lux-code)))) + +(def: project + (-> Binary (Try /.Project)) + (|>> (do> try.monad + [encoding.from-utf8] + [..read-code] + [(list) (.run /parser.project)]))) + +(program: [project-file] + (do {@ io.monad} + [data (..read-file! project-file)] + (case data + (#try.Success data) + (case (..project data) + (#try.Success value) + (do @ + [outcome (..write-pom! /pom.file value)] + (case outcome + (#try.Success value) + (wrap (log! "Successfully wrote POM file!")) + + (#try.Failure error) + (wrap (log! (format "Could not write POM file:" text.new-line + error))))) + + (#try.Failure error) + (wrap (log! (format "Invalid format file:" text.new-line + error)))) + + (#try.Failure error) + (wrap (log! (format "Could not read file: " + (%.text project-file))))))) diff --git a/stdlib/source/program/aedifex/dependency.lux b/stdlib/source/program/aedifex/dependency.lux new file mode 100644 index 000000000..2507ad589 --- /dev/null +++ b/stdlib/source/program/aedifex/dependency.lux @@ -0,0 +1,14 @@ +(.module: + [lux (#- Type)]) + +(type: #export Type + Text) + +(template [ ] + [(def: #export + Type + )] + + ["tar" lux-library] + ["jar" jvm-library] + ) diff --git a/stdlib/source/program/aedifex/parser.lux b/stdlib/source/program/aedifex/parser.lux new file mode 100644 index 000000000..f3bdbe34f --- /dev/null +++ b/stdlib/source/program/aedifex/parser.lux @@ -0,0 +1,140 @@ +(.module: + [lux (#- type) + [abstract + [monad (#+ do)]] + [control + ["<>" parser + ["" code (#+ Parser)]]] + [data + ["." text]] + [world + [net (#+ URL)]]] + [// + ["/" project] + ["//." dependency]]) + +(def: group + (Parser /.Group) + .text) + +(def: name + (Parser /.Name) + .text) + +(def: version + (Parser /.Version) + .text) + +(def: artifact' + (Parser /.Artifact) + ($_ <>.and ..group ..name ..version)) + +(def: artifact + (Parser /.Artifact) + (.tuple ..artifact')) + +(def: url + (Parser URL) + .text) + +(def: scm + (Parser /.SCM) + ..url) + +(def: license + (Parser /.License) + (.tuple ($_ <>.and + ..name + ..url + (<>.default #/.Repo + (<>.or (.this! (' #repo)) + (.this! (' #manual))))))) + +(def: organization + (Parser /.Organization) + (<| .form + (<>.after (.this! (' #organization))) + ($_ <>.and + ..name + ..url))) + +(def: developer' + (Parser /.Developer) + ($_ <>.and + ..name + ..url + (<>.maybe ..organization) + )) + +(def: developer + (Parser /.Developer) + (<| .form + (<>.after (.this! (' #developer))) + ..developer')) + +(def: contributor + (Parser /.Contributor) + (<| .form + (<>.after (.this! (' #contributor))) + ..developer')) + +(def: no-info + /.Info + {#/.url #.None + #/.scm #.None + #/.description #.None + #/.licenses (list) + #/.organization #.None + #/.developers (list) + #/.contributors (list)}) + +(def: (bundle tag parser) + (All [a] (-> Code (Parser a) (Parser (List a)))) + (.form (<>.after (.this! tag) + (<>.some parser)))) + +(def: info + (Parser /.Info) + ($_ <>.and + (<>.maybe ..url) + (<>.maybe ..scm) + (<>.maybe .text) + (<>.default (list) (..bundle (' #licenses) ..license)) + (<>.maybe ..organization) + (<>.default (list) (..bundle (' #developers) ..developer)) + (<>.default (list) (..bundle (' #contributors) ..contributor)) + )) + +(def: repository + (Parser /.Repository) + ..url) + +(def: type + (Parser //dependency.Type) + .text) + +(def: dependency + (Parser /.Dependency) + (.tuple + ($_ <>.and + ..artifact' + (<>.default //dependency.lux-library ..type) + ))) + +(def: #export project + (Parser /.Project) + (<| .form + (<>.after (.this! (' project:))) + (`` ($_ <>.and + ..artifact + (<| (<>.default ..no-info) + .form + (<>.after (.this! (' #info))) + ..info) + (<| (<>.default (list)) + (..bundle (' #repositories)) + ..repository) + (<| (<>.default (list)) + (..bundle (' #dependencies)) + ..dependency) + )))) diff --git a/stdlib/source/program/aedifex/project.lux b/stdlib/source/program/aedifex/project.lux new file mode 100644 index 000000000..a0891951f --- /dev/null +++ b/stdlib/source/program/aedifex/project.lux @@ -0,0 +1,68 @@ +(.module: + [lux (#- Name Info) + [world + [net (#+ URL)]]] + [// + ["." dependency]]) + +(type: #export Group + Text) + +(type: #export Name + Text) + +(type: #export Version + Text) + +(type: #export Artifact + {#group Group + #name Name + #version Version}) + +(type: #export Distribution + #Repo + #Manual) + +(type: #export License + [Name + URL + Distribution]) + +(type: #export SCM + URL) + +(type: #export Organization + [Name + URL]) + +(type: #export Email + Text) + +(type: #export Developer + [Name + Email + (Maybe Organization)]) + +(type: #export Contributor + Developer) + +(type: #export Info + {#url (Maybe URL) + #scm (Maybe SCM) + #description (Maybe Text) + #licenses (List License) + #organization (Maybe Organization) + #developers (List Developer) + #contributors (List Contributor)}) + +(type: #export Repository + URL) + +(type: #export Dependency + [Artifact dependency.Type]) + +(type: #export Project + {#identity Artifact + #info Info + #repositories (List Repository) + #dependencies (List Dependency)}) -- cgit v1.2.3