Add confirm command
commit
215c235f4b
@ -0,0 +1 @@
|
||||
/target
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "nu_plugin_dialog"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[[bin]]
|
||||
name = "nu_plugin_dialog"
|
||||
|
||||
[lib]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
dialoguer = "0.10.4"
|
||||
nu-plugin = "0.78.0"
|
||||
nu-protocol = "0.78.0"
|
@ -0,0 +1,32 @@
|
||||
use nu_plugin::{EvaluatedCall, LabeledError};
|
||||
use nu_protocol::Value;
|
||||
|
||||
use crate::DialogPlugin;
|
||||
|
||||
impl DialogPlugin {
|
||||
pub(crate) fn confirm(
|
||||
&self,
|
||||
call: &EvaluatedCall,
|
||||
_input: &Value,
|
||||
) -> Result<Value, LabeledError> {
|
||||
let prompt: String = call.req(0)?;
|
||||
let default_val: Option<bool> = call.get_flag("default")?;
|
||||
|
||||
let mut confirm = dialoguer::Confirm::with_theme(&*self.theme);
|
||||
confirm.with_prompt(prompt);
|
||||
|
||||
if let Some(val) = default_val {
|
||||
confirm.default(val);
|
||||
}
|
||||
let result = confirm.interact().map_err(|e| LabeledError {
|
||||
label: "Failed to prompt user".into(),
|
||||
msg: e.to_string(),
|
||||
span: Some(call.head),
|
||||
})?;
|
||||
|
||||
Ok(Value::Bool {
|
||||
val: result,
|
||||
span: call.head,
|
||||
})
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
use dialoguer::theme::{ColorfulTheme, Theme};
|
||||
use nu_plugin::{LabeledError, Plugin};
|
||||
use nu_protocol::{PluginSignature, SyntaxShape};
|
||||
|
||||
mod confirm;
|
||||
|
||||
pub struct DialogPlugin {
|
||||
pub(crate) theme: Box<dyn Theme>,
|
||||
}
|
||||
|
||||
impl DialogPlugin {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
theme: Box::new(ColorfulTheme::default()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Plugin for DialogPlugin {
|
||||
fn signature(&self) -> Vec<nu_protocol::PluginSignature> {
|
||||
vec![
|
||||
PluginSignature::build("ask").required(
|
||||
"subcommand",
|
||||
SyntaxShape::String,
|
||||
"The ask subcommand to run",
|
||||
),
|
||||
PluginSignature::build("ask confirm")
|
||||
.usage("Prompt the user with a confirmation prompt.")
|
||||
.required(
|
||||
"prompt",
|
||||
SyntaxShape::String,
|
||||
"The question to ask the user.",
|
||||
)
|
||||
.named(
|
||||
"default",
|
||||
SyntaxShape::Boolean,
|
||||
"The default selection.",
|
||||
None,
|
||||
)
|
||||
.category(nu_protocol::Category::Misc),
|
||||
]
|
||||
}
|
||||
|
||||
fn run(
|
||||
&mut self,
|
||||
name: &str,
|
||||
call: &nu_plugin::EvaluatedCall,
|
||||
input: &nu_protocol::Value,
|
||||
) -> Result<nu_protocol::Value, nu_plugin::LabeledError> {
|
||||
match name {
|
||||
"ask confirm" => self.confirm(call, input),
|
||||
"ask" =>
|
||||
Err(LabeledError {
|
||||
label: "Missing subcommand".into(),
|
||||
msg: "the subcommand to the ask command is missing".into(),
|
||||
span: Some(call.head),
|
||||
}),
|
||||
_ => Err(LabeledError {
|
||||
label: "Plugin call with wrong name signature".into(),
|
||||
msg: "the signature used to call the plugin does not match any name in the plugin signature vector".into(),
|
||||
span: Some(call.head),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
use nu_plugin::{serve_plugin, MsgPackSerializer};
|
||||
use nu_plugin_dialog::DialogPlugin;
|
||||
|
||||
fn main() {
|
||||
serve_plugin(&mut DialogPlugin::new(), MsgPackSerializer)
|
||||
}
|
Loading…
Reference in New Issue