Go to file
2023-12-03 14:08:25 -06:00
bun feat: impl ToYAML for YValue, migrate to spago@next, bun, asdf 2023-11-28 14:08:45 -06:00
docs/Data/YAML/Foreign Updates for psc 0.10.5. 2017-02-04 18:56:10 +00:00
generated-docs/Data/YAML/Foreign Documentation. Removed Foreign Code. No longer support YAML 1.1. Extra quote in YAML output fixed. 2017-05-20 15:32:55 -06:00
src/Data/YAML/Foreign fix: export yobjectexpr 2023-12-03 14:08:25 -06:00
test fix: order-preserving objects 2023-12-03 13:46:08 -06:00
.gitignore Upgrade to PureScript 0.15, remove Bower related code 2022-05-14 15:47:44 +00:00
.prettierrc.cjs feat: impl ToYAML for YValue, migrate to spago@next, bun, asdf 2023-11-28 14:08:45 -06:00
.psc-ide-port fix: order-preserving objects 2023-12-03 13:46:08 -06:00
.tool-versions feat: impl ToYAML for YValue, migrate to spago@next, bun, asdf 2023-11-28 14:08:45 -06:00
jsconfig.json feat: impl ToYAML for YValue, migrate to spago@next, bun, asdf 2023-11-28 14:08:45 -06:00
LICENSE Initial commit 2015-12-19 14:01:33 +01:00
package.json feat: impl ToYAML for YValue, migrate to spago@next, bun, asdf 2023-11-28 14:08:45 -06:00
README.md Clean up package.json and README.md 2021-03-20 11:13:39 +00:00
spago.yaml feat: impl ToYAML for YValue, migrate to spago@next, bun, asdf 2023-11-28 14:08:45 -06:00

purescript-yaml-next

Install

spago install yaml-next

YAML to Data Type Usage

Assuming we have the following Point data type and YAML string...

data Point = Point Int Int

yamlPoint :: String
yamlPoint = """
X: 1
Y: 1
"""

We can read a Point from the YAML by converting the YAML into JSON and then using purescript-argonaut's encoding functionality to get the type we need (specifically, purescript-argonaut-codecs functionality).

getPoint :: Either String Point
getPoint = case runExcept $ parseYAMLToJson yamlPoint of
  Left err -> Left "Could not parse yaml"
  Right json -> decodeJson json

instance pointJson :: DecodeJson Point where
  decodeJson s = do
    obj <- maybe (Left "Point is not an object.") Right (toObject s)
    x <- getField obj "X"
    y <- getField obj "Y"
    pure $ Point x y

Data Type to YAML Usage

YAML is represented with the following data type.

data YValue
    = YObject (M.Map String YValue)
    | YArray (Array YValue)
    | YString String
    | YNumber Number
    | YInt Int
    | YBoolean Boolean
    | YNull

To convert data into a YValue, create instances of the ToYAML class for your data types.

class ToYAML a where
    toYAML :: a -> YValue

For example to take a Point to YValue

import Data.YAML.Foreign.Encode (object, entry, class ToYAML)

instance pointToYAML :: ToYAML Point where
    toYAML (Point x y) =
        object
            [ "X" `entry` x
            , "Y" `entry` y
            ]

You can find helper functions for converting basic types into YValue in the Data.YAML.Foreign.Encode module.

Finally, if you want to convert YValue into a String, you can use the printYAML function from Data.YAML.Foreign.Encode.

printYAML :: forall a. (ToYAML a) => a -> String

Summary

Using the previous code and the type classes we defined earlier, we can go full circle from a YAML string to a PureScript Data Type and back to a YAML string.

fullCircle :: String -> Either String String
fullCircle yamlString = (readPoint yamlString) >>= pure <<< printYAML

Contributing

  1. Check out the repo
  2. Run npm install
  3. Make changes
  4. Test them by running npm test