blob: eaabd0a2da05a2771382640fd9feedf2da666d29 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE NoFieldSelectors #-}
module Main where
import ACMS.API.REST.Collection qualified
import Control.Applicative ((<**>))
import Data.Aeson qualified as J
import Data.Aeson.Encode.Pretty qualified as J
import Data.ByteString.Lazy qualified as LB
import Data.Text qualified as T
import Options.Applicative qualified as O
import Text.ParserCombinators.ReadP qualified as R
import Text.ParserCombinators.ReadPrec qualified as R
import Text.Read (Read (..))
data Args = Args
{ cmd :: Cmd
}
args :: O.Parser Args
args = Args <$> cmd_
data Cmd = CollectionCmd CollectionCmd
cmd_ :: O.Parser Cmd
cmd_ =
O.hsubparser . mconcat $
[ O.command "collection" . O.info collectionCmd $
O.progDesc "Manage content collections"
]
data CollectionCmd
= CollectionAdd Collection
| CollectionView CollectionItem
| CollectionEdit CollectionItem
| CollectionDelete CollectionItem
| --
CollectionSchema Collection
newtype Collection = Collection T.Text
deriving (Read)
data CollectionItem = CollectionItem
{ collection :: Collection,
itemFileName :: T.Text
}
instance Read CollectionItem where
readPrec = R.lift do
(Collection . T.pack -> collection) <- R.munch (/= '/')
_ <- R.string "/"
(T.pack -> itemFileName) <- do
itemFileName <- R.munch (liftA2 (&&) (/= '.') (/= '/'))
fileExt <- R.string ".json"
pure (itemFileName <> fileExt)
pure CollectionItem {..}
instance Show CollectionItem where
show (CollectionItem {collection = Collection cn, itemFileName}) =
show (cn <> "/" <> itemFileName)
collectionCmd :: O.Parser Cmd
collectionCmd = do
fmap CollectionCmd . O.hsubparser . mconcat $
[ O.command "add" . O.info (CollectionAdd <$> collectionArg) $
O.progDesc "Add an entity",
O.command "view" . O.info (CollectionView <$> collectionItemArg) $
O.progDesc "View an entity",
O.command "edit" . O.info (CollectionEdit <$> collectionItemArg) $
O.progDesc "Edit an entity",
O.command "delete" . O.info (CollectionDelete <$> collectionItemArg) $
O.progDesc "Delete an entity",
--
O.command "schema" . O.info (CollectionSchema <$> collectionArg) $
O.progDesc "Show the collection's schema"
]
collectionItemArg :: O.Parser CollectionItem
collectionItemArg =
O.argument O.auto (O.metavar "COLLECTION_PATH")
collectionArg :: O.Parser Collection
collectionArg =
Collection . T.pack <$> O.strArgument (O.metavar "COLLECTION_NAME")
main :: IO ()
main =
O.execParser (O.info (args <**> O.helper) O.idm) >>= \case
Args
{ cmd = CollectionCmd cmd
} -> case cmd of
CollectionAdd (Collection cn) -> do
print
=<< ACMS.API.REST.Collection.create cn
=<< J.throwDecode
=<< LB.getContents
CollectionView CollectionItem {collection = Collection cn, itemFileName} ->
print
=<< ACMS.API.REST.Collection.read cn itemFileName
CollectionDelete CollectionItem {collection = Collection cn, itemFileName} ->
print
=<< ACMS.API.REST.Collection.delete cn itemFileName
CollectionEdit CollectionItem {collection = Collection cn, itemFileName} ->
print
=<< ACMS.API.REST.Collection.update cn itemFileName
=<< J.throwDecode
=<< LB.getContents
CollectionSchema (Collection cn) ->
LB.putStr . J.encodePretty @J.Value
=<< ACMS.API.REST.Collection.schema cn
|