{-# LANGUAGE PatternSynonyms #-}

-- | The data model for Unison transcripts.
module Unison.Codebase.Transcript
  ( ExpectingError,
    ScratchFileName,
    Hidden (..),
    UcmLine (..),
    UcmContext (..),
    APIRequest (..),
    pattern CMarkCodeBlock,
    Stanza,
    ProcessedBlock (..),
  )
where

import CMark qualified
import Unison.Core.Project (ProjectBranchName, ProjectName)
import Unison.Prelude
import Unison.Project (ProjectAndBranch)

type ExpectingError = Bool

type ScratchFileName = Text

data Hidden = Shown | HideOutput | HideAll
  deriving (Hidden -> Hidden -> Bool
(Hidden -> Hidden -> Bool)
-> (Hidden -> Hidden -> Bool) -> Eq Hidden
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Hidden -> Hidden -> Bool
== :: Hidden -> Hidden -> Bool
$c/= :: Hidden -> Hidden -> Bool
/= :: Hidden -> Hidden -> Bool
Eq, Int -> Hidden -> ShowS
[Hidden] -> ShowS
Hidden -> String
(Int -> Hidden -> ShowS)
-> (Hidden -> String) -> ([Hidden] -> ShowS) -> Show Hidden
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Hidden -> ShowS
showsPrec :: Int -> Hidden -> ShowS
$cshow :: Hidden -> String
show :: Hidden -> String
$cshowList :: [Hidden] -> ShowS
showList :: [Hidden] -> ShowS
Show)

data UcmLine
  = UcmCommand UcmContext Text
  | -- | Text does not include the '--' prefix.
    UcmComment Text

-- | Where a command is run: a project branch (myproject/mybranch>).
data UcmContext
  = UcmContextProject (ProjectAndBranch ProjectName ProjectBranchName)

data APIRequest
  = GetRequest Text
  | APIComment Text

pattern CMarkCodeBlock :: (Maybe CMark.PosInfo) -> Text -> Text -> CMark.Node
pattern $mCMarkCodeBlock :: forall {r}.
Node -> (Maybe PosInfo -> Text -> Text -> r) -> ((# #) -> r) -> r
$bCMarkCodeBlock :: Maybe PosInfo -> Text -> Text -> Node
CMarkCodeBlock pos info body = CMark.Node pos (CMark.CODE_BLOCK info body) []

type Stanza = Either CMark.Node ProcessedBlock

data ProcessedBlock
  = Ucm Hidden ExpectingError [UcmLine]
  | Unison Hidden ExpectingError (Maybe ScratchFileName) Text
  | API [APIRequest]