@@ -10,7 +10,11 @@ Portability : portable
10
10
Migrate from or to older AST versions.
11
11
-}
12
12
module Text.Pandoc.AST.Migrator
13
- ( migrateUpToV1_21
13
+ ( ASTVersion (.. )
14
+ , migrateJSON
15
+ , migrateJSONWith
16
+ -- * migration steps
17
+ , migrateUpToV1_21
14
18
, migrateUpToV1_22
15
19
, migrateDownFromV1_21
16
20
, migrateDownFromV1_22
@@ -20,3 +24,35 @@ import Text.Pandoc.AST.V1_20.Up (migrateUpToV1_21)
20
24
import Text.Pandoc.AST.V1_21.Down (migrateDownFromV1_21 )
21
25
import Text.Pandoc.AST.V1_21.Up (migrateUpToV1_22 )
22
26
import Text.Pandoc.AST.V1_22.Down (migrateDownFromV1_22 )
27
+
28
+ import Data.Aeson (FromJSON , ToJSON , eitherDecode , encode )
29
+ import Data.ByteString.Lazy (ByteString )
30
+
31
+ data ASTVersion
32
+ = V1_20 -- ^ Version 1.20
33
+ | V1_21 -- ^ Version 1.21
34
+ | V1_22 -- ^ Version 1.22
35
+ deriving (Eq , Ord , Show )
36
+
37
+ migrateJSON :: ASTVersion -- ^ initial version
38
+ -> ASTVersion -- ^ target version
39
+ -> ByteString -- ^ input JSON
40
+ -> ByteString -- ^ migrated JSON
41
+ migrateJSON from to =
42
+ case (from, to) of
43
+ (V1_20 , V1_20 ) -> id
44
+ (V1_20 , V1_21 ) -> migrateJSONWith migrateUpToV1_21
45
+ (V1_20 , V1_22 ) -> migrateJSONWith (migrateUpToV1_22 . migrateUpToV1_21)
46
+ (V1_21 , V1_21 ) -> id
47
+ (V1_21 , V1_22 ) -> migrateJSONWith (migrateUpToV1_22 . migrateUpToV1_21)
48
+ (V1_22 , V1_22 ) -> id
49
+ (V1_22 , V1_21 ) -> migrateJSONWith migrateDownFromV1_22
50
+ (V1_22 , V1_20 ) -> migrateJSONWith (migrateDownFromV1_21 . migrateDownFromV1_22)
51
+ (V1_21 , V1_20 ) -> migrateJSONWith migrateDownFromV1_21
52
+
53
+ migrateJSONWith :: (FromJSON a , ToJSON b )
54
+ => (a -> b ) -- ^ Migration function
55
+ -> ByteString -- ^ Input JSON
56
+ -> ByteString -- ^ Migrated JSON
57
+ migrateJSONWith migrator =
58
+ encode . either error migrator . eitherDecode
0 commit comments