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

import Prelude.Compat

import Data.Text

import qualified Data.XML.Types as XML
import qualified Text.Atom.Feed as Atom
import qualified Text.RSS.Syntax as RSS
import qualified Text.RSS1.Syntax as RSS1

-- | The abstract type of feed documents. The internal representation
-- is as whatever feed variant type the document was either imported or
-- has now been translated to.
data Feed
  = AtomFeed Atom.Feed
  | RSSFeed RSS.RSS
  | RSS1Feed RSS1.Feed
    -- if we're unable to correctly the well-formed XML as a feed,
    -- keep it as an untyped document.
  | XMLFeed XML.Element
  deriving (Show)

-- | The abstract type of feed items. Like the 'Text.Feed.Types.Feed' type, the
-- representation of a value is as one of the different RSS item\/entry
-- variants.
data Item
  = AtomItem Atom.Entry
  | RSSItem RSS.RSSItem
  | RSS1Item RSS1.Item
  | XMLItem XML.Element
  deriving (Show)

-- | The kinds of feed documents supported.
data FeedKind
  = AtomKind
  | RSSKind (Maybe Text) -- Nothing => default version (2.0)
  | RDFKind (Maybe Text) -- Nothing => default version (1.0)
  deriving (Eq, Show)