0 | module Idris.Package.ToJson
  1 |
  2 | import Idris.Package.Types
  3 | import Libraries.Data.String.Extra
  4 | import Data.List
  5 | import Core.FC
  6 | import Core.Name.Namespace
  7 |
  8 | %default total
  9 |
 10 | -- We don't bother with a robust JSON implementation
 11 | -- for this one-off JSON serialization.
 12 |
 13 | private infixl 0 ~~=
 14 |
 15 | interface ToJson v where
 16 |   toJson : v -> String
 17 |
 18 | ToJson String where
 19 |   toJson str = "\"\{str}\""
 20 |
 21 | ToJson Bool where
 22 |   toJson False = "false"
 23 |   toJson True = "true"
 24 |
 25 | ToJson a => ToJson (List a) where
 26 |   toJson xs = "[\{join "," $ map toJson xs}]"
 27 |
 28 | (~=) : ToJson v => String -> v -> String
 29 | (~=) field value = "\{toJson field}: \{toJson value}"
 30 |
 31 | (~~=) : ToJson v => String -> Maybe v -> Maybe String
 32 | (~~=) field = map (field ~=)
 33 |
 34 | ToJson PkgVersion where
 35 |   toJson v = "\"\{show v}\""
 36 |
 37 | ToJson PkgVersionBounds where
 38 |   toJson (MkPkgVersionBounds lowerBound lowerInclusive upperBound upperInclusive) =
 39 |     let fields =
 40 |         [ "lowerInclusive" ~= lowerInclusive
 41 |         , "lowerBound"     ~= maybe "*" show lowerBound
 42 |         , "upperInclusive" ~= upperInclusive
 43 |         , "upperBound"     ~= maybe "*" show upperBound
 44 |         ]
 45 |     in
 46 |       "{\{join "," fields}}"
 47 |
 48 | ToJson Depends where
 49 |   toJson (MkDepends pkgname pkgbounds) = "{\{pkgname ~= pkgbounds}}"
 50 |
 51 | ToJson ModuleIdent where
 52 |   toJson ident = "\"\{show ident}\""
 53 |
 54 | namespace Package
 55 |   export
 56 |   toJson : PkgDesc -> String
 57 |   toJson (MkPkgDesc
 58 |             name
 59 |             version
 60 |             langversion
 61 |             authors
 62 |             maintainers
 63 |             license
 64 |             brief
 65 |             readme
 66 |             homepage
 67 |             sourceloc
 68 |             bugtracker
 69 |             depends
 70 |             modules
 71 |             mainmod
 72 |             executable
 73 |             options
 74 |             sourcedir
 75 |             builddir
 76 |             outputdir
 77 |             prebuild
 78 |             postbuild
 79 |             preinstall
 80 |             postinstall
 81 |             preclean
 82 |             postclean) =
 83 |     let optionalFields = catMaybes $
 84 |           [ "version"     ~~= version
 85 |           , "langversion" ~~= langversion
 86 |           , "authors"     ~~= authors
 87 |           , "maintainers" ~~= maintainers
 88 |           , "license"     ~~= license
 89 |           , "brief"       ~~= brief
 90 |           , "readme"      ~~= readme
 91 |           , "homepage"    ~~= homepage
 92 |           , "sourceloc"   ~~= sourceloc
 93 |           , "bugtracker"  ~~= bugtracker
 94 |           , "main"        ~~= fst <$> mainmod
 95 |           , "executable"  ~~= executable
 96 |           , "opts"        ~~= snd <$> options
 97 |           , "sourcedir"   ~~= sourcedir
 98 |           , "builddir"    ~~= builddir
 99 |           , "outputdir"   ~~= outputdir
100 |           , "prebuild"    ~~= snd <$> prebuild
101 |           , "postbuild"   ~~= snd <$> postbuild
102 |           , "preinstall"  ~~= snd <$> preinstall
103 |           , "postinstall" ~~= snd <$> postinstall
104 |           , "preclean"    ~~= snd <$> preclean
105 |           , "postclean"   ~~= snd <$> postclean
106 |           ]
107 |         fields =
108 |           [ "name"    ~= name
109 |           , "depends" ~= depends
110 |           , "modules" ~= fst <$> modules
111 |           ] ++ optionalFields
112 |     in
113 |       "{\{join "," fields}}"
114 |
115 |