    --------------------------------------------------------------------
    -- |
    -- Module    : Text.DublinCore.Types
    -- Copyright : (c) Galois, Inc. 2008,
    --             (c) Sigbjorn Finne 2009-
    -- License   : BSD3
    --
    -- Maintainer: Sigbjorn Finne <sof@forkIO.com>
    -- Stability : provisional
    --
    -- Representing the DublinCore metadata elements in Haskell.
    -- For information on the Dublin Core Metadata Element Set,
    -- see: <http://dublincore.org/>
    --
    module Text.DublinCore.Types
      ( DCItem(..)
      , DCInfo(..)
      , infoToTag
      , dc_element_names
      ) where

    import Prelude.Compat

    import Data.Text

    -- | A DCItem pairs a specific element with its (string) value.
    data DCItem = DCItem
      { dcElt :: DCInfo
      , dcText :: Text
      } deriving (Eq, Show)

    -- | The Dublin Core Metadata Element Set, all 15 of them (plus an extension constructor.)
    data DCInfo
      = DC_Title -- ^ A name given to the resource.
      | DC_Creator -- ^ An entity primarily responsible for making the content of the resource.
      | DC_Subject -- ^ The topic of the content of the resource.
      | DC_Description -- ^ An account of the content of the resource.
      | DC_Publisher -- ^ An entity responsible for making the resource available
      | DC_Contributor -- ^ An entity responsible for making contributions to the content of the resource.
      | DC_Date -- ^ A date associated with an event in the life cycle of the resource (YYYY-MM-DD)
      | DC_Type -- ^ The nature or genre of the content of the resource.
      | DC_Format -- ^ The physical or digital manifestation of the resource.
      | DC_Identifier -- ^ An unambiguous reference to the resource within a given context.
      | DC_Source -- ^ A Reference to a resource from which the present resource is derived.
      | DC_Language -- ^ A language of the intellectual content of the resource.
      | DC_Relation -- ^ A reference to a related resource.
      | DC_Coverage -- ^ The extent or scope of the content of the resource.
      | DC_Rights -- ^ Information about rights held in and over the resource.
      | DC_Other Text -- ^ Other; data type extension mechanism.
      deriving (Eq, Show)

    infoToTag :: DCInfo -> Text
    infoToTag i =
      case i of
        DC_Title -> "title"
        DC_Creator -> "creator"
        DC_Subject -> "subject"
        DC_Description -> "description"
        DC_Publisher -> "publisher"
        DC_Contributor -> "contributor"
        DC_Date -> "date"
        DC_Type -> "type"
        DC_Format -> "format"
        DC_Identifier -> "identifier"
        DC_Source -> "source"
        DC_Language -> "language"
        DC_Relation -> "relation"
        DC_Coverage -> "coverage"
        DC_Rights -> "rights"
        DC_Other o -> o

    dc_element_names :: [Text]
    dc_element_names =
      [ "title"
      , "creator"
      , "subject"
      , "description"
      , "publisher"
      , "contributor"
      , "date"
      , "type"
      , "format"
      , "identifier"
      , "source"
      , "language"
      , "relation"
      , "coverage"
      , "rights"
      ]