packages feed

hix-0.7.0: lib/Hix/CabalParsec.hs

module Hix.CabalParsec where

import Distribution.Parsec (Parsec, eitherParsec)
import Exon (exon)
import Type.Reflection (typeRep)

import Hix.Data.Monad (M)
import Hix.Monad (eitherClient)

eitherParsecFor ::
  Parsec b =>
  ToString a =>
  String ->
  a ->
  Either String b
eitherParsecFor desc spec =
  first errorMessage (eitherParsec s)
  where
    errorMessage err = error [exon|parsing #{desc} "#{s}": #{err}|]
    s = toString spec

unsafeParsecFor ::
  Parsec b =>
  ToString a =>
  String ->
  a ->
  b
unsafeParsecFor desc spec =
  either error id (eitherParsecFor desc spec)

unsafeParsec ::
  ∀ a b .
  Parsec b =>
  Typeable b =>
  ToString a =>
  a ->
  b
unsafeParsec =
  unsafeParsecFor (show (typeRep @b))

parsecM ::
  Parsec b =>
  ToString a =>
  String ->
  a ->
  M b
parsecM desc spec =
  eitherClient (first toText (eitherParsecFor desc spec))