    -- TH.hs: WebDAV client library - bits using TH
    -- Copyright © 2012-2013  Clint Adams
    --
    -- vim: softtabstop=4:shiftwidth=4:expandtab
    --
    -- This program is free software: you can redistribute it and/or modify
    -- it under the terms of the GNU General Public License as published by
    -- the Free Software Foundation, either version 3 of the License, or
    -- (at your option) any later version.
    --
    -- This program is distributed in the hope that it will be useful,
    -- but WITHOUT ANY WARRANTY; without even the implied warranty of
    -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -- GNU General Public License for more details.
    --
    -- You should have received a copy of the GNU General Public License
    -- along with this program.  If not, see <http://www.gnu.org/licenses/>.

    {-# LANGUAGE TemplateHaskell #-}

    module Network.Protocol.HTTP.DAV.TH where

    import Control.Lens (makeLenses)
    import qualified Data.ByteString as B
    import Network.HTTP.Client (Manager, Request)

    data Depth = Depth0 | Depth1 | DepthInfinity
    instance Read Depth where
        readsPrec :: Int -> ReadS Depth
    readsPrec Int
    _ String
    x
            | String
    x String -> String -> Bool
    forall a. Eq a => a -> a -> Bool
    == String
    "0" = [(Depth
    Depth0, String
    "")]
            | String
    x String -> String -> Bool
    forall a. Eq a => a -> a -> Bool
    == String
    "1" = [(Depth
    Depth1, String
    "")]
            | String
    x String -> String -> Bool
    forall a. Eq a => a -> a -> Bool
    == String
    "infinity" = [(Depth
    DepthInfinity, String
    "")]
            | Bool
    otherwise = ReadS Depth
    forall a. String -> [a]
    forall (m :: * -> *) a. MonadFail m => String -> m a
    fail String
    "invalid"
    instance Show Depth where
        show :: Depth -> String
    show Depth
    Depth0 = String
    "0"
        show Depth
    Depth1 = String
    "1"
        show Depth
    DepthInfinity = String
    "infinity"

    data DAVContext = DAVContext {
        DAVContext -> [ByteString]
    _allowedMethods :: [B.ByteString]
      , DAVContext -> Request
    _baseRequest :: Request
      , DAVContext -> ByteString
    _basicusername :: B.ByteString
      , DAVContext -> ByteString
    _basicpassword :: B.ByteString
      , DAVContext -> [ByteString]
    _complianceClasses :: [B.ByteString]
      , DAVContext -> Maybe Depth
    _depth :: Maybe Depth
      , DAVContext -> Maybe Manager
    _httpManager :: Maybe Manager
      , DAVContext -> Maybe ByteString
    _lockToken :: Maybe B.ByteString
      , DAVContext -> ByteString
    _userAgent :: B.ByteString
    }
    makeLenses ''DAVContext