module Proteome.Files.Syntax where

import qualified Data.Map.Strict as Map (fromList)
import Ribosome.Data.SyntaxItem (SyntaxItem (options, params))
import Ribosome.Syntax (HiLink (HiLink), Syntax (Syntax), syntaxMatch, syntaxVerbatim)
import Text.RawString.QQ (r)

asterisk :: SyntaxItem
asterisk =
  item {options, params}
  where
    item = syntaxMatch "ProFilesAsterisk" [r|^ \*|]
    options = ["skipwhite"]
    params = Map.fromList [("nextgroup", "ProFilesBase,ProFilesName")]

base :: SyntaxItem
base =
  item {options, params}
  where
    item = syntaxMatch "ProFilesBase" [r|\[[^]]\+\]|]
    options = ["skipwhite", "contained"]
    params = Map.fromList [("nextgroup", "ProFilesName")]

name :: SyntaxItem
name =
  item {options}
  where
    item = syntaxMatch "ProFilesName" ".*"
    options = ["contained"]

sync :: SyntaxItem
sync =
  syntaxVerbatim "syntax sync minlines=1"

hlAsterisk :: HiLink
hlAsterisk =
  HiLink "ProFilesAsterisk" "Todo"

hlBase :: HiLink
hlBase =
  HiLink "ProFilesBase" "Directory"

hlName :: HiLink
hlName =
  HiLink "ProFilesName" "Type"

filesSyntax :: Syntax
filesSyntax =
  Syntax items [] links
  where
    items =
      [asterisk, base, name, sync]
    links =
      [hlAsterisk, hlBase, hlName]