Prefix.hs 1.7 KB
Newer Older
1
{-|
2
Module      : Gargantext.Core.Utils.Prefix
3 4 5 6 7 8 9 10 11 12 13 14
Description : 
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX

Here is a longer description of this module, containing some
commentary with @some markup@.
-}

{-# LANGUAGE NoImplicitPrelude #-}
15

16
module Gargantext.Core.Utils.Prefix where
17

18 19
import Prelude

20 21 22 23 24
import Data.Aeson (Value, defaultOptions, parseJSON)
import Data.Aeson.TH (Options, fieldLabelModifier, omitNothingFields)
import Data.Aeson.Types (Parser)
import Data.Char (toLower)
import Data.Monoid ((<>))
25
import Text.Read (Read(..),readMaybe)
26 27 28 29 30 31 32 33 34 35 36 37


-- | Aeson Options that remove the prefix from fields
unPrefix :: String -> Options
unPrefix prefix = defaultOptions
  { fieldLabelModifier = unCapitalize . dropPrefix prefix
  , omitNothingFields = True
  }

-- | Lower case leading character
unCapitalize :: String -> String
unCapitalize [] = []
38 39
unCapitalize (c:cs) = toLower c : cs
--unCapitalize cs = map toLower cs
40 41 42 43 44

-- | Remove given prefix
dropPrefix :: String -> String -> String
dropPrefix prefix input = go prefix input
  where
45
    go pre [] = error $ conStringual $ "prefix leftover: " <> pre
46 47 48
    go [] (c:cs) = c : cs
    go (p:preRest) (c:cRest)
      | p == c = go preRest cRest
49
      | otherwise = error $ conStringual $ "not equal: " <>  (p:preRest)  <> " " <> (c:cRest)
50

51
    conStringual msg = "dropPrefix: " <> msg <> ". " <> prefix <> " " <> input
52 53 54 55 56

parseJSONFromString :: (Read a) => Value -> Parser a
parseJSONFromString v = do
  numString <- parseJSON v
  case readMaybe (numString :: String) of
57
    Nothing -> fail $ "Invalid number for TransactionID: " ++ show v -- TODO error message too specific
58
    Just n -> return n