    --------------------------------------------------------------------
    -- |
    -- Module    : Text.Atom.Feed.Link
    -- Copyright : (c) Galois, Inc. 2008,
    --             (c) Sigbjorn Finne 2009-
    -- License   : BSD3
    --
    -- Maintainer: Sigbjorn Finne <sof@forkIO.com>
    -- Stability : provisional
    -- Portability: portable
    --
    --------------------------------------------------------------------

    module Text.Atom.Feed.Link
      ( LinkRelation(..)
      , showLinkRelation
      , showLinkAttr
      ) where

    -- | Atom feeds uses typed IRI links to represent
    -- information \/ metadata that is of interest to the
    -- consumers (software, in the main) of feeds. For instance,
    -- the edit link relation attached to an atom:entry element
    -- points to the IRI to use to update\/edit it.
    --
    -- The Atom standard encourages that such typed links to
    -- be registered with IANA if they have wider applicability,
    -- and the 'LinkRelation' data type encodes the currently
    -- registered link types (derived from:
    --  http:\/\/www.iana.org\/assignments\/link-relations.html
    -- on 2007-10-28]
    --
    data LinkRelation               -- relevant RFC:
     = LinkAlternate                -- http://www.rfc-editor.org/rfc/rfc4287.txt
     | LinkCurrent                  -- http://www.rfc-editor.org/rfc/rfc5005.txt
     | LinkEnclosure                -- http://www.rfc-editor.org/rfc/rfc4287.txt
     | LinkEdit                     -- http://www.rfc-editor.org/rfc/rfc5023.txt
     | LinkEditMedia                -- http://www.rfc-editor.org/rfc/rfc5023.txt
     | LinkFirst                    -- http://www.iana.org/assignments/link-relations/first
     | LinkLast                     -- http://www.iana.org/assignments/link-relations/last
     | LinkLicense                  -- http://www.rfc-editor.org/rfc/rfc4946.txt
     | LinkNext                     -- http://www.rfc-editor.org/rfc/rfc5005.txt
     | LinkNextArchive              -- http://www.rfc-editor.org/rfc/rfc5005.txt
     | LinkPayment                  -- http://www.iana.org/assignments/link-relations/payment
     | LinkPrevArchive              -- http://www.rfc-editor.org/rfc/rfc5005.txt
     | LinkPrevious                 -- http://www.rfc-editor.org/rfc/rfc5005.txt
     | LinkRelated                  -- http://www.rfc-editor.org/rfc/rfc4287.txt
     | LinkReplies                  -- http://www.rfc-editor.org/rfc/rfc4685.txt
     | LinkSelf                     -- http://www.rfc-editor.org/rfc/rfc4287.txt
     | LinkVia                      -- http://www.rfc-editor.org/rfc/rfc4287.txt
     | LinkOther String
         deriving (Eq, Show)

    showLinkRelation :: LinkRelation -> String
    showLinkRelation lr =
      case lr of
       LinkAlternate   -> "alternate"
       LinkCurrent     -> "current"
       LinkEnclosure   -> "enclosure"
       LinkEdit        -> "edit"
       LinkEditMedia   -> "edit-media"
       LinkFirst       -> "first"
       LinkLast        -> "last"
       LinkLicense     -> "license"
       LinkNext        -> "next"
       LinkNextArchive -> "next-archive"
       LinkPayment     -> "payment"
       LinkPrevArchive -> "prev-archive"
       LinkPrevious    -> "previous"
       LinkRelated     -> "related"
       LinkReplies     -> "replies"
       LinkSelf        -> "self"
       LinkVia         -> "via"
       LinkOther s     -> s

    showLinkAttr :: LinkRelation -> String{-URI-} -> String
    showLinkAttr lr s = showLinkRelation lr ++ '=':'"':concatMap escQ s ++ "\""
     where
      escQ '"' = "&dquot;"
      escQ x   = [x]