{-
  Copyright (C) 2009 John Millikin <jmillikin@gmail.com>
  
  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
  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/>.
-}

module DBus.UUID
        ( UUID
        , toHex
        , fromHex
        ) where
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as TL


newtype UUID = UUID Text -- TODO: (Word64, Word64)?
        deriving (Eq)

instance Show UUID where
        showsPrec d uuid = showParen (d > 10) $
                showString "UUID " . shows (toHex uuid)

toHex :: UUID -> Text
toHex (UUID text) = text

fromHex :: Text -> Maybe UUID
fromHex text = if validUUID text
        then Just $ UUID text
        else Nothing

validUUID :: Text -> Bool
validUUID text = valid where
        valid = and [TL.length text == 32, TL.all validChar text]
        validChar c = or
                [ c >= '0' && c <= '9'
                , c >= 'a' && c <= 'f'
                , c >= 'A' && c <= 'F'
                ]