lean4-htt/Leanpkg2/TomlConfig.lean
2021-06-06 19:27:18 -04:00

70 lines
2.5 KiB
Text

/-
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Gabriel Ebner, Sebastian Ullrich, Mac Malone
-/
import Leanpkg2.Toml
import Leanpkg2.LeanVersion
import Leanpkg2.Package
open System
namespace Leanpkg2
def leanpkgToml : FilePath := "leanpkg.toml"
namespace Source
def fromToml? (v : Toml.Value) : Option Source :=
(do let Toml.Value.str dir ← v.lookup "path" | none
path ⟨dir⟩) <|>
(do let Toml.Value.str url ← v.lookup "git" | none
let Toml.Value.str rev ← v.lookup "rev" | none
match v.lookup "branch" with
| none => git url rev none
| some (Toml.Value.str branch) => git url rev (some branch)
| _ => none)
def toToml : Source → Toml.Value
| path dir => Toml.Value.table [("path", Toml.Value.str dir.toString)]
| git url rev none =>
Toml.Value.table [("git", Toml.Value.str url), ("rev", Toml.Value.str rev)]
| git url rev (some branch) =>
Toml.Value.table [("git", Toml.Value.str url), ("branch", Toml.Value.str branch), ("rev", Toml.Value.str rev)]
end Source
namespace PackageConfig
def fromToml? (t : Toml.Value) : Option PackageConfig := OptionM.run do
let pkg ← t.lookup "package"
let Toml.Value.str name ← pkg.lookup "name" | none
let Toml.Value.str version ← pkg.lookup "version" | none
let module ← match pkg.lookup "module" with
| some (Toml.Value.str mod) => mod
| none => some name.capitalize
| _ => none
let leanVersion ← match pkg.lookup "lean_version" with
| some (Toml.Value.str leanVer) => some leanVer
| none => some leanVersionString
| _ => none
let timeout ← match pkg.lookup "timeout" with
| some (Toml.Value.nat timeout) => some (some timeout)
| none => some none
| _ => none
let Toml.Value.table deps ← t.lookup "dependencies" <|> some (Toml.Value.table []) | none
let dependencies ← deps.mapM fun ⟨n, src⟩ => do Dependency.mk n (← Source.fromToml? src)
return { name, module, version, leanVersion, dependencies, timeout }
def fromTomlString? (str : String) : IO (Option PackageConfig) := do
fromToml? (← Toml.parse str)
def fromTomlFile? (path : FilePath) : IO (Option PackageConfig) := do
fromTomlString? (← IO.FS.readFile path)
def fromTomlFile (path : FilePath) : IO PackageConfig := do
let some config ← fromTomlFile? path
| throw <| IO.userError s!"configuration (at {path}) is ill-formed"
config
end PackageConfig