diff options
author | Alexander Foremny <aforemny@posteo.de> | 2024-06-05 22:47:49 +0200 |
---|---|---|
committer | Alexander Foremny <aforemny@posteo.de> | 2024-06-05 23:36:34 +0200 |
commit | bfb98d7675515394e1b9a0417bfafc83d775611c (patch) | |
tree | dec841dc2ca6b79f8eaa777b90b3b1473f369c9d /common | |
parent | 2064b4e7767dca2858d8093597503a594dcd74ef (diff) |
add schema version
Diffstat (limited to 'common')
-rw-r--r-- | common/CHANGELOG.md | 5 | ||||
-rw-r--r-- | common/LICENSE | 30 | ||||
-rw-r--r-- | common/common.cabal | 21 | ||||
-rw-r--r-- | common/src/Version.hs | 36 |
4 files changed, 92 insertions, 0 deletions
diff --git a/common/CHANGELOG.md b/common/CHANGELOG.md new file mode 100644 index 0000000..47b7089 --- /dev/null +++ b/common/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for common + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/common/LICENSE b/common/LICENSE new file mode 100644 index 0000000..c90516a --- /dev/null +++ b/common/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2024, Alexander Foremny + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Alexander Foremny nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/common/common.cabal b/common/common.cabal new file mode 100644 index 0000000..738d8be --- /dev/null +++ b/common/common.cabal @@ -0,0 +1,21 @@ +cabal-version: 3.4 +name: common +version: 0.1.0.0 +license: BSD-3-Clause +license-file: LICENSE +maintainer: aforemny@posteo.de +author: Alexander Foremny +build-type: Simple +extra-doc-files: CHANGELOG.md + +library + exposed-modules: Version + hs-source-dirs: src + default-language: GHC2021 + default-extensions: ViewPatterns + ghc-options: -Wall + build-depends: + aeson, + base, + split, + text diff --git a/common/src/Version.hs b/common/src/Version.hs new file mode 100644 index 0000000..cb568e6 --- /dev/null +++ b/common/src/Version.hs @@ -0,0 +1,36 @@ +module Version + ( Version (..), + versionToString, + versionFromText, + versionFromString, + ) +where + +import Data.Aeson qualified as A +import Data.Aeson.Types qualified as A +import Data.List +import Data.List.Split +import Data.Text qualified as T + +data Version = Version Int Int Int + deriving (Show, Eq) + +instance A.ToJSON Version where + toJSON = + A.toJSON . versionToString + +instance A.FromJSON Version where + parseJSON (A.String (versionFromText -> Just version)) = pure version + parseJSON v = A.typeMismatch "version" v + +versionToString :: Version -> String +versionToString (Version major minor patch) = + intercalate "." (map show [major, minor, patch]) + +versionFromString :: String -> Maybe Version +versionFromString (map read . splitOn "." -> [major, minor, patch]) = + Just (Version major minor patch) +versionFromString _ = Nothing + +versionFromText :: T.Text -> Maybe Version +versionFromText = versionFromString . T.unpack |