content: module Puppet.Language.NativeTypes.Exec (nativeExec) where
  
  import qualified Data.Text as Text
  import Puppet.Language.NativeTypes.Helpers
  
  nativeExec :: (NativeTypeName, NativeTypeMethods)
  nativeExec = ("exec", nativetypemethods parameterfunctions fullyQualifiedOrPath)
  
  -- Autorequires: If Puppet is managing the user or group that owns a file, the file resource will autorequire them. If Puppet is managing any parent directories of a file, the file resource will autorequire them.
  parameterfunctions :: [(Text, [Text -> NativeTypeValidate])]
  parameterfunctions =
    [ ("command", [nameval]),
      ("creates", [rarray, strings, fullyQualifieds]),
      ("cwd", [string, fullyQualified]),
      ("environment", [rarray, strings]),
      ("group", [string]),
      ("logoutput", [defaultvalue "false", string, values ["true", "false", "on_failure"]]),
      ("onlyif", [string]),
      ("path", [rarray, strings, fullyQualifieds]),
      ("provider", [string, values ["posix", "shell", "windows"]]),
      ("refresh", [string]),
      ("refreshonly", [defaultvalue "false", string, values ["true", "false"]]),
      ("returns", [defaultvalue "0", rarray, integers]),
      ("timeout", [defaultvalue "300", integer]),
      ("tries", [defaultvalue "1", integer]),
      ("try_sleep", [defaultvalue "0", integer]),
      ("unless", [string]),
      ("user", [string])
    ]
  
  fullyQualifiedOrPath :: NativeTypeValidate
  fullyQualifiedOrPath res =
    case (res ^. rattributes . at "path", res ^. rattributes . at "command") of
      (Nothing, Just (PString x)) ->
        if Text.head x == '/'
          then Right res
          else Left "Command must be fully qualified if path is not defined"
      _ -> Right res
  