{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE ImportQualifiedPost #-} #!/usr/bin/env cabal {- cabal: build-depends: base , text , kdl-hs -} import KDL import KDL.Decoder.Internal.Decoder import Control.Applicative import Data.Text import Data.Text qualified as T import Data.Text.IO qualified as T newtype Var = Var Text deriving stock (Eq,Ord, Show) myNodeDecoder :: DecodeArrow NodeList () (Either Var Text) myNodeDecoder = KDL.nodeWith "node" $ (Right <$> KDL.argWith' ["text"] KDL.text) <|> (Left <$> KDL.argWith' ["var"] (Var <$> KDL.text)) main :: IO () main = do let input1 = "node (var)ref" let input2 = "node value" let decoder = KDL.document myNodeDecoder T.putStrLn $ processResult $ KDL.decodeWith decoder input1 T.putStrLn $ processResult $ KDL.decodeWith decoder input2 processResult :: Show a => Either DecodeError a -> Text processResult (Left err) = renderDecodeError err processResult (Right value) = T.show value