module Web.Slack.Types.Time where
import Data.Time.Clock.POSIX
import Data.Aeson
import Data.Aeson.Types
import qualified Data.Text as T
import Control.Applicative
import Control.Error
import Control.Lens.TH
default ()
newtype Time = Time { _getTime :: POSIXTime } deriving (Fractional, Num, Real, Eq, Ord, Show)
data SlackTimeStamp = SlackTimeStamp { _slackTime :: Time, _timestampUid :: Int } deriving (Show, Ord, Eq)
makeLenses ''SlackTimeStamp
makeLenses ''Time
instance FromJSON SlackTimeStamp where
parseJSON = withText "SlackTimeStamp"
(\s -> let (ts, tail -> uid) = break (== '.') (T.unpack s) in
SlackTimeStamp
<$> fmap (Time . realToFrac) (readZ ts :: Parser Integer)
<*> readZ uid)
instance FromJSON Time where
parseJSON = withScientific "Time" (return . Time . realToFrac)