packages feed

neuron-0.4.0.0: src/app/Neuron/Zettelkasten/Error.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Neuron.Zettelkasten.Error
  ( NeuronError (..),
  )
where

import Neuron.Zettelkasten.ID (ZettelID, zettelIDSourceFileName, zettelIDText)
import Neuron.Zettelkasten.Query.Error
import Relude
import qualified Text.Show
import qualified Text.URI as URI

data NeuronError
  = -- A zettel file contains invalid link that neuron cannot parse
    NeuronError_BadQuery ZettelID QueryError
  deriving (Eq)

instance Show NeuronError where
  show (NeuronError_BadQuery fromZid e) =
    let msg = case e of
          Left qe ->
            "it contains a query URI (" <> URI.render (queryParseErrorUri qe) <> ") " <> case qe of
              QueryParseError_UnsupportedHost _uri ->
                "with unsupported host"
              QueryParseError_InvalidID _uri e'' ->
                "with invalidID: " <> show e''
          Right (QueryResultError_NoSuchZettel zid) ->
            "Zettel "
              <> zettelIDText zid
              <> " does not exist"
     in toString $
          unlines
            [ "",
              "  Zettel file \"" <> toText (zettelIDSourceFileName fromZid) <> "\" is malformed:",
              "    " <> msg
            ]