diff options
author | Vincent Ambo <mail@tazj.in> | 2023-01-28T10·45+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2023-01-31T13·11+0000 |
commit | 4da1e64c030fc9b1bb23f1ef90546a531b5f760e (patch) | |
tree | 2a5d85f927faa4e1dc3909d88a0f9719a26e6429 /tvix/serde | |
parent | 7702941dd9f561cb1f90ada28aa7401ea54a86db (diff) |
feat(tvix/serde): add an example application to the project r/5785
This shows how people can use tvix_serde to deserialise configuration structs for their programs from Nix code. Change-Id: I71bf4e03dce19dddafe67dd729b4e4b10719a739 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7945 Reviewed-by: flokli <flokli@flokli.de> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/serde')
-rw-r--r-- | tvix/serde/.skip-subtree | 1 | ||||
-rw-r--r-- | tvix/serde/examples/cfg-demo.rs | 34 | ||||
-rw-r--r-- | tvix/serde/examples/foods.nix | 22 |
3 files changed, 57 insertions, 0 deletions
diff --git a/tvix/serde/.skip-subtree b/tvix/serde/.skip-subtree new file mode 100644 index 000000000000..21b2d0d3580d --- /dev/null +++ b/tvix/serde/.skip-subtree @@ -0,0 +1 @@ +The foods.nix can not be read by readTree. diff --git a/tvix/serde/examples/cfg-demo.rs b/tvix/serde/examples/cfg-demo.rs new file mode 100644 index 000000000000..8d31c9fb0450 --- /dev/null +++ b/tvix/serde/examples/cfg-demo.rs @@ -0,0 +1,34 @@ +//! This program demonstrates how to use tvix_serde to deserialise +//! program configuration (or other data) from Nix code. +//! +//! This makes it possible to use Nix as an embedded config language. +//! For greater control over evaluation, and for features like adding +//! additional builtins, depending directly on tvix_eval would be +//! required. +use serde::Deserialize; +use std::collections::HashMap; + +#[derive(Debug, Deserialize)] +enum Flavour { + Tasty, + Okay, + Eww, +} + +#[derive(Debug, Deserialize)] +struct Data { + name: String, + foods: HashMap<String, Flavour>, +} + +fn main() { + // Get the content from wherever, read it from a file, receive it + // over the network - whatever floats your boat! We'll include it + // as a string. + let code = include_str!("foods.nix"); + + // Now you can use tvix_serde to deserialise the struct: + let foods: Data = tvix_serde::from_str(code).expect("deserialisation should succeed"); + + println!("These are the foods:\n{:#?}", foods); +} diff --git a/tvix/serde/examples/foods.nix b/tvix/serde/examples/foods.nix new file mode 100644 index 000000000000..c8733cd3efec --- /dev/null +++ b/tvix/serde/examples/foods.nix @@ -0,0 +1,22 @@ +# This is content for the `Data` struct, written in intentionally +# convoluted Nix code. +let + mkFlavour = flavour: name: { + inherit name; + value = flavour; + }; + + tasty = mkFlavour "Tasty"; + okay = mkFlavour "Okay"; + eww = mkFlavour "Eww"; +in +{ + name = "exhaustive list of foods"; + + foods = builtins.listToAttrs [ + (tasty "beef") + (okay "tomatoes") + (eww "olives") + (tasty "coffee") + ]; +} |