git.iko.soy/typeable/octopod
on master help sign in
Use cassava for parsing csv (#84)

* Use cassava for parsing csv * Report parse exceptions to the log

commit434c9f8126fba9fcba4b87c67d70948cac0e3b69 authormniip <mniip@users.noreply.github.com> dateMon 30 Aug 2021, 17:21 (5 years ago) parent0336964
5 files changed+15−17
octopod-backend/octopod-backend.cabal+1 octopod-backend/src/Octopod/Server.hs+4−4 octopod-backend/src/Types.hs+6−13 octopod-common/octopod-common.cabal+2 octopod-common/src/Common/Types.hs+2
octopod-backend/octopod-backend.cabal+1
@@ -73,6 +73,7 @@ library
7373 , async
7474 , base >=4.7 && <5
7575 , bytestring
76+ , cassava
7677 , conduit
7778 , deriving-aeson
7879 , octopod-common
octopod-backend/src/Octopod/Server.hs+4−4
@@ -33,7 +33,7 @@ import Data.Int
3333import qualified Data.Map.Ordered.Strict as OM
3434import Data.Maybe
3535import Data.Pool
36−import Data.Text (lines, pack, unpack, unwords)
36+import Data.Text (pack, unpack, unwords)
3737import qualified Data.Text as T
3838import qualified Data.Text.Encoding as T
3939import Data.Time
@@ -443,9 +443,9 @@ updateDeploymentInfo dName = do
443443 dc <- getDefaultConfig dName
444444 (ec, out, err) <- runCommandArgs infoCommand =<< infoCommandArgs dc dep
445445 case ec of
446− ExitSuccess -> do
447− dMeta <- liftBase $ parseDeploymentMetadata (lines . unStdout $ out)
448− upsertDeploymentMetadatum dName dMeta
446+ ExitSuccess -> case parseDeploymentMetadata (unStdout out) of
447+ Right dMeta -> upsertDeploymentMetadatum dName dMeta
448+ Left err -> liftBase $ log $ "could not get deployment info, could not parse CSV: " <> T.pack err
449449 ExitFailure _ ->
450450 liftBase $
451451 log $
octopod-backend/src/Types.hs+6−13
@@ -19,26 +19,19 @@ module Types
1919 )
2020where
2121
22−import Data.Bifunctor
2322import Data.ByteString (ByteString)
23+import qualified Data.ByteString.Lazy as BS
24+import Data.Csv
25+import Data.Foldable
2426import Data.Text as T
25−import Data.Traversable
27+import Data.Text.Encoding as T
2628
2729import Common.Types
2830import Data.Time
2931
3032-- | Parses deployment metadata.
31−parseDeploymentMetadata :: [Text] -> IO DeploymentMetadata
32−parseDeploymentMetadata texts = fmap DeploymentMetadata $
33− for texts $ \t ->
34− case T.findIndex (== ',') t of
35− Just i -> do
36− let (key, value) = bimap strip (T.tail . strip) $ T.splitAt i t
37− pure $ DeploymentMetadatum key value
38− Nothing ->
39− error $
40− "Malformed metadata key-value pair " <> T.unpack t
41− <> ", should be similar to foo,bar"
33+parseDeploymentMetadata :: Text -> Either String DeploymentMetadata
34+parseDeploymentMetadata = fmap (DeploymentMetadata . toList) . decode NoHeader . BS.fromStrict . T.encodeUtf8
4235
4336-- | Server port.
4437newtype ServerPort = ServerPort {unServerPort :: Int}
octopod-common/octopod-common.cabal+2
@@ -24,6 +24,7 @@ library
2424 default-extensions: BlockArguments
2525 , ConstraintKinds
2626 , DataKinds
27+ , DeriveAnyClass
2728 , DeriveFunctor
2829 , DeriveGeneric
2930 , DerivingVia
@@ -48,6 +49,7 @@ library
4849 , AllowAmbiguousTypes
4950 build-depends: base
5051 , aeson
52+ , cassava
5153 , bytestring
5254 , deriving-aeson
5355 , generic-lens
octopod-common/src/Common/Types.hs+2
@@ -9,6 +9,7 @@ module Common.Types where
99
1010import Control.Lens
1111import Data.Aeson hiding (Result)
12+import Data.Csv
1213import Data.Generics.Labels ()
1314import Data.Int
1415import Data.Map.Ordered.Strict (OMap, (<>|))
@@ -203,6 +204,7 @@ data DeploymentMetadatum = DeploymentMetadatum
203204 }
204205 deriving stock (Generic, Show, Eq, Ord)
205206 deriving (FromJSON, ToJSON) via Snake DeploymentMetadatum
207+ deriving anyclass (FromRecord)
206208
207209data DeploymentInfo = DeploymentInfo
208210 { deployment :: Deployment