module Data.Radius.Attribute.Pair (
NumberAbstract (..),
TypedNumber, unsafeTypedNumber, untypeNumber,
Attribute' (..), Attribute (..), value,
TypedNumberSet, typed,
TypedNumberSets (..),
) where
import Control.Applicative ((<$>))
import Control.Monad (guard)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Maybe (MaybeT (..))
import Data.ByteString (ByteString)
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Radius.Scalar (AtText, AtString, AtInteger, AtIpV4, )
import qualified Data.Radius.Attribute.Number as Radius
data NumberAbstract a
= Standard Radius.Number
| Vendors a
deriving (Eq, Ord, Show)
newtype TypedNumber v a =
TypedNumber (NumberAbstract v)
deriving (Eq, Ord, Show)
unsafeTypedNumber :: NumberAbstract v -> TypedNumber v a
unsafeTypedNumber = TypedNumber
untypeNumber :: TypedNumber v a -> NumberAbstract v
untypeNumber (TypedNumber n) = n
data Attribute' v =
Attribute' !(NumberAbstract v) !ByteString
deriving (Eq, Ord, Show)
data Attribute v a =
Attribute !(TypedNumber v a) !a
deriving (Eq, Ord, Show)
value :: Attribute v a -> a
value (Attribute _ v) = v
type TypedNumberSet v a = Set (TypedNumber v a)
typed :: (Monad m, Functor m, Ord v)
=> TypedNumberSet v a
-> (ByteString -> m b)
-> Attribute' v
-> MaybeT m (Attribute v b)
typed s parse (Attribute' n d) = do
let typedAN = unsafeTypedNumber n
guard $ typedAN `Set.member` s
lift $ Attribute typedAN <$> parse d
class TypedNumberSets v where
attributeNumbersText :: TypedNumberSet v AtText
attributeNumbersString :: TypedNumberSet v AtString
attributeNumbersInteger :: TypedNumberSet v AtInteger
attributeNumbersIpV4 :: TypedNumberSet v AtIpV4