module Text.JSON.ToJson (ToJson(..)) where import qualified Data.JSON.Types as J import Data.Int (Int32) import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as LBS import Data.Text.Encoding.Error (lenientDecode) import qualified Data.Text as TS import qualified Data.Text.Encoding as TSE import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TLE import Data.Int (Int64) class ToJson a where toJson :: a -> J.Value toJsons :: [a] -> J.Value toJsons = J.ValueArray . map toJson instance ToJson a => ToJson [a] where toJson = toJsons instance ToJson () where toJson _ = J.ValueArray [] instance (ToJson a, ToJson b) => ToJson (a,b) where toJson (a,b) = J.ValueArray [ toJson a, toJson b ] instance (ToJson a, ToJson b, ToJson c) => ToJson (a,b,c) where toJson (a,b,c) = J.ValueArray [ toJson a, toJson b, toJson c ] instance (ToJson a, ToJson b, ToJson c, ToJson d) => ToJson (a,b,c,d) where toJson (a,b,c,d) = J.ValueArray [toJson a, toJson b, toJson c, toJson d] instance ToJson J.Value where toJson = id instance ToJson Bool where toJson = J.ValueAtom . J.AtomBoolean instance ToJson Char where toJson c = J.ValueAtom $ J.AtomText $ TL.pack (c:[]) toJsons = J.ValueAtom . J.AtomText . TL.pack instance (ToJson S.ByteString) where toJson = J.ValueAtom . J.AtomText . TL.fromChunks . return . TSE.decodeUtf8With lenientDecode instance (ToJson LBS.ByteString) where toJson = J.ValueAtom . J.AtomText . TLE.decodeUtf8With lenientDecode instance ToJson TS.Text where toJson = J.ValueAtom . J.AtomText . TL.fromChunks . return instance ToJson TL.Text where toJson = J.ValueAtom . J.AtomText instance (ToJson Int32) where toJson = J.ValueAtom . J.AtomNumber . toRational instance (ToJson Int64) where toJson = J.ValueAtom . J.AtomNumber . toRational instance (ToJson Int) where toJson = J.ValueAtom . J.AtomNumber . toRational instance (ToJson Float) where toJson = J.ValueAtom . J.AtomNumber . toRational instance (ToJson Double) where toJson = J.ValueAtom . J.AtomNumber . toRational