{-|
Copyright   : (c) Nathan Bloomfield, 2017
License     : GPL-3
Maintainer  : nbloomf@gmail.com
Stability   : experimental
-}

module Hakyll.Shortcode.Types.Iso_639_1_Language_Code (
  Iso_639_1_Language_Code()
) where

import Hakyll.Shortcode.Validate

-- | ISO 639.1 two-letter language codes.
-- See <http://www.loc.gov/standards/iso639-2/php/code_list.php>.
-- Must be constructed with 'validate'.
newtype Iso_639_1_Language_Code
  = Make { unMake :: String } deriving Eq

instance Validate Iso_639_1_Language_Code where
  validate text = if elem text codes
    then Right $ Make text
    else Left "Must be an ISO 639.1 two-letter language code."
    where
      codes =
        [ "ab", "aa", "af", "ak", "sq", "am", "ar", "an", "hy", "as"
        , "av", "ae", "ay", "az", "bm", "ba", "eu", "be", "bn", "bh"
        , "bi", "bs", "br", "bg", "my", "ca", "ch", "ce", "ny", "zh"
        , "cv", "kw", "co", "cr", "hr", "cs", "da", "dv", "nl", "dz"
        , "en", "eo", "et", "ee", "fo", "fj", "fi", "fr", "ff", "gl"
        , "ka", "de", "el", "gn", "gu", "ht", "ha", "he", "hz", "hi"
        , "ho", "hu", "ia", "id", "ie", "ga", "ig", "ik", "io", "is"
        , "it", "iu", "ja", "jv", "kl", "kn", "kr", "ks", "kk", "km"
        , "ki", "rw", "ky", "kv", "kg", "ko", "ku", "kj", "la", "lb"
        , "lg", "li", "ln", "lo", "lt", "lu", "lv", "gv", "mk", "mg"
        , "ms", "ml", "mt", "mi", "mr", "mh", "mn", "na", "nv", "nd"
        , "ne", "ng", "nb", "nn", "no", "ii", "nr", "oc", "oj", "cu"
        , "om", "or", "os", "pa", "pi", "fa", "pl", "ps", "pt", "qu"
        , "rm", "rn", "ro", "ru", "sa", "sc", "sd", "se", "sm", "sg"
        , "sr", "gd", "sn", "si", "sk", "sl", "so", "st", "es", "su"
        , "sw", "ss", "sv", "ta", "te", "tg", "th", "ti", "bo", "tk"
        , "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "ug", "uk"
        , "ur", "uz", "ve", "vi", "vo", "wa", "cy", "wo", "fy", "xh"
        , "yi", "yo", "za", "zu"
        ]

instance Show Iso_639_1_Language_Code where
  show = unMake