" Vim syntax file for .shout files
" Language: shout (shell integration tests)

if exists("b:current_syntax")
  finish
endif

" Directives — must appear before first command
syn match shoutDirectiveKey /^@env\s/ contained
syn match shoutDirectiveKey /^@setup\s/ contained
syn match shoutDirectiveKey /^@teardown\s/ contained
syn match shoutEnvDirective /^@env\s\+\S\+=.*$/ contains=shoutDirectiveKey,shoutEnvName
syn match shoutEnvName /\S\+\ze=/ contained nextgroup=shoutEnvEquals
syn match shoutEnvEquals /=/ contained nextgroup=shoutEnvValue
syn match shoutEnvValue /.*$/ contained
syn match shoutSetupDirective /^@setup\s\+.*$/ contains=shoutDirectiveKey
syn match shoutTeardownDirective /^@teardown\s\+.*$/ contains=shoutDirectiveKey

" Comment commands: $# ... or $ # ...
syn match shoutCommentCommand /^\$#.*$/
syn match shoutCommentCommand /^\$\s\+#.*$/

" Command lines: $ command
syn match shoutPrompt /^\$\s/ contained
syn match shoutCommand /^\$\s.\+/ contains=shoutPrompt,shoutInlineComment
syn match shoutInlineComment /\s\+#[^"']*$/ contained

" Escaped dollar in expected output
syn match shoutEscapedDollar /^\\\$/ contained
syn match shoutEscapedLine /^\\\$.*$/ contains=shoutEscapedDollar

" Wildcards
syn match shoutWildcardLine /^\.\.\.$/
syn match shoutWildcardInline /\.\.\./ contained

" Exit code assertions
syn match shoutExitCode /^\[\d\+\]$/
syn match shoutExitCodeWild /^\[\*\]$/

" Expected output (anything not matched above)
syn match shoutExpectedOutput /^[^$@\[\\].*$/ contains=shoutWildcardInline

" Highlighting
hi def link shoutDirectiveKey Keyword
hi def link shoutEnvDirective PreProc
hi def link shoutEnvName Identifier
hi def link shoutEnvEquals Operator
hi def link shoutEnvValue String
hi def link shoutSetupDirective PreProc
hi def link shoutTeardownDirective PreProc

hi def link shoutCommentCommand Comment

hi def link shoutPrompt Special
hi def link shoutCommand Statement
hi def link shoutInlineComment Comment

hi def link shoutEscapedDollar SpecialChar
hi def link shoutEscapedLine String

hi def link shoutWildcardLine WarningMsg
hi def link shoutWildcardInline WarningMsg

hi def link shoutExitCode Constant
hi def link shoutExitCodeWild Constant

hi def link shoutExpectedOutput String

let b:current_syntax = "shout"
