content: module Puppet.Language.NativeTypes.ZoneRecord (nativeZoneRecord) where
  
  import Puppet.Language.NativeTypes.Helpers
  
  nativeZoneRecord :: (NativeTypeName, NativeTypeMethods)
  nativeZoneRecord = ("zone_record", nativetypemethods parameterfunctions validateMandatories)
  
  -- 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 =
    [ ("name", [nameval]),
      ("owner", [string]),
      ("dest", [string]),
      ("ensure", [defaultvalue "present", string, values ["present", "absent"]]),
      ("rtype", [string, defaultvalue "A", values ["SOA", "A", "AAAA", "MX", "NS", "CNAME", "PTR", "SRV"]]),
      ("rclass", [defaultvalue "IN", string]),
      ("ttl", [defaultvalue "2d", string]),
      ("target", [string, mandatory]),
      ("nsname", [string]),
      ("serial", [string]),
      ("slave_refresh", [string]),
      ("slave_retry", [string]),
      ("slave_expiration", [string]),
      ("min_ttl", [string]),
      ("email", [string])
    ]
  
  validateMandatories :: NativeTypeValidate
  validateMandatories res =
    case res ^. rattributes . at "rtype" of
      Nothing -> perror "The rtype parameter is mandatory."
      Just (PString "SOA") ->
        foldM (flip mandatory) res ["nsname", "email", "serial", "slave_refresh", "slave_retry", "slave_expiration", "min_ttl"]
      Just (PString "NS") -> foldM (flip mandatory) res ["owner", "rclass", "rtype", "dest"]
      Just (PString _) -> foldM (flip mandatory) res ["owner", "rclass", "rtype", "dest", "ttl"]
      Just x -> perror $ "Can't use this for the rtype parameter" <+> pretty x
  