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