1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use crate::commands::WholeStreamCommand; use crate::prelude::*; use nu_errors::ShellError; use nu_protocol::{Signature, TaggedDictBuilder}; use std::sync::atomic::Ordering; pub struct Shells; #[async_trait] impl WholeStreamCommand for Shells { fn name(&self) -> &str { "shells" } fn signature(&self) -> Signature { Signature::build("shells") } fn usage(&self) -> &str { "Display the list of current shells." } async fn run( &self, args: CommandArgs, registry: &CommandRegistry, ) -> Result<OutputStream, ShellError> { shells(args, registry) } } fn shells(args: CommandArgs, _registry: &CommandRegistry) -> Result<OutputStream, ShellError> { let mut shells_out = VecDeque::new(); let tag = args.call_info.name_tag; for (index, shell) in args.shell_manager.shells.lock().iter().enumerate() { let mut dict = TaggedDictBuilder::new(&tag); if index == (*args.shell_manager.current_shell).load(Ordering::SeqCst) { dict.insert_untagged("active", "X".to_string()); } else { dict.insert_untagged("active", " ".to_string()); } dict.insert_untagged("name", shell.name()); dict.insert_untagged("path", shell.path()); shells_out.push_back(dict.into_value()); } Ok(shells_out.into()) } #[cfg(test)] mod tests { use super::Shells; #[test] fn examples_work_as_expected() { use crate::examples::test as test_examples; test_examples(Shells {}) } }