added example for a config using FromValue

This commit is contained in:
Tim 'Piepmatz' Hesse 2024-06-25 13:28:56 +02:00
parent 9b7f899410
commit 4f6c0cd8a2

View File

@ -1,10 +1,37 @@
use std::path::PathBuf;
use nu_plugin::{EngineInterface, EvaluatedCall, SimplePluginCommand};
use nu_protocol::{Category, LabeledError, Signature, Type, Value};
use nu_protocol::{Category, FromValue, LabeledError, Signature, Spanned, Type, Value};
use crate::ExamplePlugin;
pub struct Config;
/// Example config struct.
///
/// Using the `FromValue` derive macro, structs can be easily loaded from [`Value`]s,
/// similar to serde's `Deserialize` macro.
/// This is handy for plugin configs or piped data.
/// All fields must implement [`FromValue`].
/// For [`Option`] fields, they can be omitted in the config.
///
/// This example shows that nested and spanned data work too, so you can describe nested
/// structures and get spans of values wrapped in [`Spanned`].
/// Since this config uses only `Option`s, no field is required in the config.
#[allow(dead_code)]
#[derive(Debug, FromValue)]
struct PluginConfig {
path: Option<Spanned<PathBuf>>,
nested: Option<SubConfig>,
}
#[allow(dead_code)]
#[derive(Debug, FromValue)]
struct SubConfig {
bool: bool,
string: String,
}
impl SimplePluginCommand for Config {
type Plugin = ExamplePlugin;
@ -39,7 +66,11 @@ impl SimplePluginCommand for Config {
) -> Result<Value, LabeledError> {
let config = engine.get_plugin_config()?;
match config {
Some(config) => Ok(config.clone()),
Some(value) => {
let config = PluginConfig::from_value(value.clone())?;
println!("got config {config:?}");
Ok(value)
}
None => Err(LabeledError::new("No config sent").with_label(
"configuration for this plugin was not found in `$env.config.plugins.example`",
call.head,