    --------------------------------------------------------------------
    -- |
    -- 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

    -- | A DCItem pairs a specific element with its (string) value.
    data DCItem
     = DCItem
         { dcElt  :: DCInfo
         , dcText :: String
         }
         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 String  -- ^ Other; data type extension mechanism.
         deriving (Eq, Show)

    infoToTag :: DCInfo -> String
    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 :: [String]
    dc_element_names
     = [ "title"
       , "creator"
       , "subject"
       , "description"
       , "publisher"
       , "contributor"
       , "date"
       , "type"
       , "format"
       , "identifier"
       , "source"
       , "language"
       , "relation"
       , "coverage"
       , "rights"
       ]