Skip to content

Commit 3729592

Browse files
committed
implement writeMetadataDiff_
1 parent b7d1953 commit 3729592

File tree

14 files changed

+330
-124
lines changed

14 files changed

+330
-124
lines changed

cli/graph.cabal

Lines changed: 12 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cli/package.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ default-extensions:
116116
- RecordWildCards
117117
- ScopedTypeVariables
118118
- StandaloneDeriving
119+
- StandaloneKindSignatures
119120
- StrictData
120121
- TupleSections
121122
- TypeApplications

cli/src/DAL/DirectoryFormat.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@ import Effect.RawGraph
77
metadataFile :: FilePath -> NID -> FilePath
88
metadataFile base nid = base </> (show nid ++ ".json")
99

10-
nodeDataFile :: FilePath -> NID -> FilePath
11-
nodeDataFile base nid = base </> (show nid ++ ".data")
10+
legacyNodeDataFile :: FilePath -> NID -> FilePath
11+
legacyNodeDataFile base nid = nodeDataFile base nid ".data"
12+
13+
nodeDataFile :: FilePath -> NID -> String -> FilePath
14+
nodeDataFile base nid extension = base </> (show nid ++ extension)
1215

1316
getMetadataFile :: Member RawGraph effs => NID -> Sem effs FilePath
1417
getMetadataFile nid = metadataFile <$> getGraphFilePath <*> pure nid
1518

16-
getNodeDataFile :: Member RawGraph effs => NID -> Sem effs FilePath
17-
getNodeDataFile nid = nodeDataFile <$> getGraphFilePath <*> pure nid
19+
getNodeDataFile :: Member RawGraph effs => NID -> String -> Sem effs FilePath
20+
getNodeDataFile nid extension =
21+
nodeDataFile <$> getGraphFilePath <*> pure nid <*> pure extension

cli/src/DAL/FileSystemOperations.hs

Lines changed: 0 additions & 106 deletions
This file was deleted.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
{-# LANGUAGE TemplateHaskell #-}
2+
3+
module DAL.FileSystemOperations.Data where
4+
5+
import DAL.DirectoryFormat
6+
import Effect.RawGraph
7+
import Error.Missing
8+
import Error.UserError
9+
import Models.NID
10+
import MyPrelude
11+
import System.Directory (removeFile)
12+
import System.MacOS.NSFileCoordinator
13+
14+
data GraphDataFilesystemOperations m a where
15+
ReadNodeData :: NID -> String -> GraphDataFilesystemOperations m (Maybe ByteString)
16+
WriteNodeData :: NID -> String -> ByteString -> GraphDataFilesystemOperations m ()
17+
DeleteNodeData :: NID -> String -> GraphDataFilesystemOperations m ()
18+
19+
makeSem ''GraphDataFilesystemOperations
20+
21+
readNodeData_ ::
22+
Members [RawGraph, Embed IO, Error UserError] effs =>
23+
NID ->
24+
-- | File extension for the node's data
25+
String ->
26+
Sem effs (Maybe ByteString)
27+
readNodeData_ nid fileExtension = do
28+
path <- getNodeDataFile nid fileExtension
29+
result <- embed $
30+
coordinateReading path False defaultReadingOptions $ \path' ->
31+
try @IO @IOError $ readFile path'
32+
pure $ either (const Nothing) Just result
33+
34+
writeNodeData_ ::
35+
Members [RawGraph, Embed IO, Error UserError] effs =>
36+
NID ->
37+
-- | File extension for the node's data
38+
String ->
39+
ByteString ->
40+
Sem effs ()
41+
writeNodeData_ nid extension rawData = do
42+
path <- getNodeDataFile nid extension
43+
embedCatchingErrors $
44+
coordinateWriting path False defaultWritingOptions $ \path' ->
45+
writeFile path' rawData
46+
47+
deleteNodeData_ ::
48+
Members [RawGraph, Embed IO, Error UserError] effs =>
49+
NID ->
50+
-- | File extension for the node's data
51+
String ->
52+
Sem effs ()
53+
deleteNodeData_ nid extension = do
54+
path <- getNodeDataFile nid extension
55+
embedCatchingErrors $
56+
coordinateWriting path False defaultWritingOptions removeFile
57+
58+
runGraphDataFilesystemOperationsIO ::
59+
Members [RawGraph, Embed IO, Error UserError] r =>
60+
Sem (GraphDataFilesystemOperations : r) a ->
61+
Sem r a
62+
runGraphDataFilesystemOperationsIO = interpret \case
63+
ReadNodeData nid extension -> readNodeData_ nid extension
64+
WriteNodeData nid extension rawData -> writeNodeData_ nid extension rawData
65+
DeleteNodeData nid extension -> deleteNodeData_ nid extension
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{-# LANGUAGE TemplateHaskell #-}
2+
3+
module DAL.FileSystemOperations.Metadata where
4+
5+
import DAL.DTO
6+
import DAL.JSON
7+
import DAL.DirectoryFormat
8+
import Effect.RawGraph
9+
import Error.Missing
10+
import Error.UserError
11+
import Models.NID
12+
import Models.Node
13+
import MyPrelude
14+
import System.MacOS.NSFileCoordinator
15+
import System.Directory (removeFile)
16+
17+
data GraphMetadataFilesystemOperations m a where
18+
ReadNodeMetadata :: NID -> GraphMetadataFilesystemOperations m (Maybe (Node Text ()))
19+
WriteNodeMetadata :: Node Text () -> GraphMetadataFilesystemOperations m ()
20+
DeleteNodeMetadata :: NID -> GraphMetadataFilesystemOperations m ()
21+
22+
makeSem ''GraphMetadataFilesystemOperations
23+
24+
readNodeMetadata_ ::
25+
Members [Embed IO, Error UserError] effs =>
26+
FilePath -> Sem effs (Maybe (Node Text ()))
27+
readNodeMetadata_ path = withEarlyReturn do
28+
result <- embedCatchingErrors $ coordinateReading path False defaultReadingOptions $ \path' ->
29+
try @IO @IOError $ readFile path'
30+
serialized <- either (const $ returnEarly Nothing) pure result
31+
dto <- decodeJSON serialized
32+
pure $ Just (nodeFromDTO dto)
33+
34+
writeNodeMetadata_ ::
35+
Members [Embed IO, Error UserError] effs =>
36+
FilePath ->
37+
Node Text () ->
38+
Sem effs ()
39+
writeNodeMetadata_ path node = do
40+
let dto = nodeToDTO node
41+
let serialized = toStrict $ encodeJSON dto
42+
embedCatchingErrors $ coordinateWriting path False defaultWritingOptions $ \path' ->
43+
writeFile path' serialized
44+
45+
deleteNodeMetadata_ ::
46+
Members [RawGraph, Embed IO, Error UserError] effs =>
47+
FilePath ->
48+
Sem effs ()
49+
deleteNodeMetadata_ path = do
50+
embedCatchingErrors $ coordinateWriting path False defaultWritingOptions $ \path' ->
51+
removeFile path'
52+
53+
runGraphMetadataFilesystemOperations ::
54+
Members [RawGraph, Embed IO, Error UserError] r =>
55+
Sem (GraphMetadataFilesystemOperations : r) a ->
56+
Sem r a
57+
runGraphMetadataFilesystemOperations = interpret \case
58+
ReadNodeMetadata nid -> readNodeMetadata_ =<< getMetadataFile nid
59+
WriteNodeMetadata node -> (`writeNodeMetadata_` node) =<< getMetadataFile node.nid
60+
DeleteNodeMetadata nid -> deleteNodeMetadata_ =<< getMetadataFile nid

0 commit comments

Comments
 (0)