module Toml (
Table,
Value(..),
parse,
prettyToml,
DocClass(..),
decode,
encode,
Result(..),
) where
import Text.Printf (printf)
import Toml.FromValue (FromValue (fromValue), Result(..))
import Toml.FromValue.Matcher (runMatcher)
import Toml.Located (Located(Located))
import Toml.Parser (parseRawToml)
import Toml.Position (Position(posColumn, posLine))
import Toml.Pretty (TomlDoc, DocClass(..), prettyToml, prettySemanticError, prettyMatchMessage)
import Toml.Semantics (semantics)
import Toml.ToValue (ToTable (toTable))
import Toml.Value (Table, Value(..))
parse :: String -> Either String Table
parse :: String -> Either String Table
parse String
str =
case String -> Either (Located String) [Expr]
parseRawToml String
str of
Left (Located Position
p String
e) -> String -> Either String Table
forall a b. a -> Either a b
Left (String -> Int -> Int -> String -> String
forall r. PrintfType r => String -> r
printf String
"%d:%d: %s" (Position -> Int
posLine Position
p) (Position -> Int
posColumn Position
p) String
e)
Right [Expr]
exprs ->
case [Expr] -> Either (Located SemanticError) Table
semantics [Expr]
exprs of
Left (Located Position
p SemanticError
e) ->
String -> Either String Table
forall a b. a -> Either a b
Left (String -> Int -> Int -> String -> String
forall r. PrintfType r => String -> r
printf String
"%d:%d: %s" (Position -> Int
posLine Position
p) (Position -> Int
posColumn Position
p) (SemanticError -> String
prettySemanticError SemanticError
e))
Right Table
tab -> Table -> Either String Table
forall a b. b -> Either a b
Right Table
tab
decode :: FromValue a => String -> Result String a
decode :: forall a. FromValue a => String -> Result String a
decode String
str =
case String -> Either String Table
parse String
str of
Left String
e -> [String] -> Result String a
forall e a. [e] -> Result e a
Failure [String
e]
Right Table
tab ->
case Matcher a -> Result MatchMessage a
forall a. Matcher a -> Result MatchMessage a
runMatcher (Value -> Matcher a
forall a. FromValue a => Value -> Matcher a
fromValue (Table -> Value
Table Table
tab)) of
Failure [MatchMessage]
es -> [String] -> Result String a
forall e a. [e] -> Result e a
Failure (MatchMessage -> String
prettyMatchMessage (MatchMessage -> String) -> [MatchMessage] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [MatchMessage]
es)
Success [MatchMessage]
ws a
x -> [String] -> a -> Result String a
forall e a. [e] -> a -> Result e a
Success (MatchMessage -> String
prettyMatchMessage (MatchMessage -> String) -> [MatchMessage] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [MatchMessage]
ws) a
x
encode :: ToTable a => a -> TomlDoc
encode :: forall a. ToTable a => a -> TomlDoc
encode = Table -> TomlDoc
prettyToml (Table -> TomlDoc) -> (a -> Table) -> a -> TomlDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Table
forall a. ToTable a => a -> Table
toTable