module Ribosome.Data.Mapping where

import Data.MessagePack (Object)
import Ribosome.Data.ErrorReport (ErrorReport(ErrorReport))
import Ribosome.Error.Report.Class (ReportError(..))
import System.Log (Priority(NOTICE, ERROR))

newtype MappingIdent =
  MappingIdent Text
  deriving (MappingIdent -> MappingIdent -> Bool
(MappingIdent -> MappingIdent -> Bool)
-> (MappingIdent -> MappingIdent -> Bool) -> Eq MappingIdent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MappingIdent -> MappingIdent -> Bool
$c/= :: MappingIdent -> MappingIdent -> Bool
== :: MappingIdent -> MappingIdent -> Bool
$c== :: MappingIdent -> MappingIdent -> Bool
Eq, Int -> MappingIdent -> ShowS
[MappingIdent] -> ShowS
MappingIdent -> String
(Int -> MappingIdent -> ShowS)
-> (MappingIdent -> String)
-> ([MappingIdent] -> ShowS)
-> Show MappingIdent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MappingIdent] -> ShowS
$cshowList :: [MappingIdent] -> ShowS
show :: MappingIdent -> String
$cshow :: MappingIdent -> String
showsPrec :: Int -> MappingIdent -> ShowS
$cshowsPrec :: Int -> MappingIdent -> ShowS
Show)

data Mapping =
  Mapping {
    Mapping -> MappingIdent
mappingIdent :: MappingIdent,
    Mapping -> Text
mappingLhs :: Text,
    Mapping -> Text
mappingMode :: Text,
    Mapping -> Bool
mappingRemap :: Bool,
    Mapping -> Bool
mappingBuffer :: Bool
  }
  deriving (Mapping -> Mapping -> Bool
(Mapping -> Mapping -> Bool)
-> (Mapping -> Mapping -> Bool) -> Eq Mapping
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Mapping -> Mapping -> Bool
$c/= :: Mapping -> Mapping -> Bool
== :: Mapping -> Mapping -> Bool
$c== :: Mapping -> Mapping -> Bool
Eq, Int -> Mapping -> ShowS
[Mapping] -> ShowS
Mapping -> String
(Int -> Mapping -> ShowS)
-> (Mapping -> String) -> ([Mapping] -> ShowS) -> Show Mapping
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Mapping] -> ShowS
$cshowList :: [Mapping] -> ShowS
show :: Mapping -> String
$cshow :: Mapping -> String
showsPrec :: Int -> Mapping -> ShowS
$cshowsPrec :: Int -> Mapping -> ShowS
Show)

data MappingError =
  NoSuchMapping MappingIdent
  |
  InvalidArgs [Object]
  deriving (MappingError -> MappingError -> Bool
(MappingError -> MappingError -> Bool)
-> (MappingError -> MappingError -> Bool) -> Eq MappingError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MappingError -> MappingError -> Bool
$c/= :: MappingError -> MappingError -> Bool
== :: MappingError -> MappingError -> Bool
$c== :: MappingError -> MappingError -> Bool
Eq, Int -> MappingError -> ShowS
[MappingError] -> ShowS
MappingError -> String
(Int -> MappingError -> ShowS)
-> (MappingError -> String)
-> ([MappingError] -> ShowS)
-> Show MappingError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MappingError] -> ShowS
$cshowList :: [MappingError] -> ShowS
show :: MappingError -> String
$cshow :: MappingError -> String
showsPrec :: Int -> MappingError -> ShowS
$cshowsPrec :: Int -> MappingError -> ShowS
Show)

deepPrisms ''MappingError

instance ReportError MappingError where
  errorReport :: MappingError -> ErrorReport
errorReport (NoSuchMapping (MappingIdent Text
ident)) =
    Text -> [Text] -> Priority -> ErrorReport
ErrorReport (Text
"no mapping defined for `" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
ident Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>Text
"`") [Text
"no such mapping: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
ident] Priority
NOTICE
  errorReport (InvalidArgs [Object]
args) =
    Text -> [Text] -> Priority -> ErrorReport
ErrorReport Text
"internal error while executing mapping" [Item [Text]
"invalid mapping args:", [Object] -> Text
forall b a. (Show a, IsString b) => a -> b
show [Object]
args] Priority
ERROR