From 1f16d370a534176abd70c0178e4c7499a8dfc153 Mon Sep 17 00:00:00 2001 From: Ryuichi Ueda Date: Sun, 21 Jan 2024 09:47:52 +0900 Subject: [PATCH] Add trait --- src/elements/subword.rs | 20 ++++++++++++++++++++ src/elements/subword/unquoted.rs | 6 ++++++ src/elements/word.rs | 9 +++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/elements/subword.rs b/src/elements/subword.rs index 55ae0c2e..78b3e4c9 100644 --- a/src/elements/subword.rs +++ b/src/elements/subword.rs @@ -3,3 +3,23 @@ pub mod unquoted; +use crate::{Feeder, ShellCore}; +use super::subword::unquoted::UnquotedSubword; +use std::fmt; +use std::fmt::Debug; + +impl Debug for dyn Subword { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fmt.debug_struct(&self.get_text()).finish() + } +} + +pub trait Subword { + fn get_text(&self) -> String; + fn eval(&mut self) -> Vec>; +} + +pub fn parse(feeder: &mut Feeder, core: &mut ShellCore) -> Option> { + if let Some(a) = UnquotedSubword::parse(feeder, core){ Some(Box::new(a)) } + else{ None } +} diff --git a/src/elements/subword/unquoted.rs b/src/elements/subword/unquoted.rs index fdbe12ab..4a86be7d 100644 --- a/src/elements/subword/unquoted.rs +++ b/src/elements/subword/unquoted.rs @@ -2,12 +2,18 @@ //SPDX-License-Identifier: BSD-3-Clause use crate::{ShellCore, Feeder}; +use crate::elements::subword::Subword; #[derive(Debug)] pub struct UnquotedSubword { pub text: String, } +impl Subword for UnquotedSubword { + fn get_text(&self) -> String { self.text.clone() } + fn eval(&mut self) -> Vec> { vec![vec![self.text.clone()]] } +} + impl UnquotedSubword { fn new() -> UnquotedSubword { UnquotedSubword { diff --git a/src/elements/word.rs b/src/elements/word.rs index e0b7d840..5704917c 100644 --- a/src/elements/word.rs +++ b/src/elements/word.rs @@ -2,12 +2,13 @@ //SPDX-License-Identifier: BSD-3-Clause use crate::{Feeder, ShellCore}; -use crate::elements::subword::unquoted::UnquotedSubword; +use crate::elements::subword; +use crate::elements::subword::Subword; #[derive(Debug)] pub struct Word { pub text: String, - pub subwords: Vec, + pub subwords: Vec>, } impl Word { @@ -24,8 +25,8 @@ impl Word { pub fn parse(feeder: &mut Feeder, core: &mut ShellCore) -> Option { let mut ans = Word::new(); - while let Some(sw) = UnquotedSubword::parse(feeder, core) { - ans.text += &sw.text.clone(); + while let Some(sw) = subword::parse(feeder, core) { + ans.text += &sw.get_text(); ans.subwords.push(sw); }