Skip to content

Commit 1350a99

Browse files
committed
Convert variables to OsString with into_os_string()
Instead of relying on debug output, use IntoOsString trait to do the conversion. For PathBuf/OsString/OsStr, it will call the same method name to do the conversion.
1 parent acc09b8 commit 1350a99

File tree

4 files changed

+55
-39
lines changed

4 files changed

+55
-39
lines changed

macros/src/lexer.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use std::iter::Peekable;
1414
pub fn scan_str_lit(lit: &Literal) -> TokenStream {
1515
let s = lit.to_string();
1616
if !s.starts_with('\"') {
17-
return quote!(::cmd_lib::CmdString::default().append(&#lit.to_owned()));
17+
return quote!(::cmd_lib::CmdString::default().append(&#lit));
1818
}
1919
let mut iter = s[1..s.len() - 1] // To trim outside ""
2020
.chars()
@@ -64,7 +64,7 @@ pub fn scan_str_lit(lit: &Literal) -> TokenStream {
6464
}
6565
if !var.is_empty() {
6666
let var = syn::parse_str::<Ident>(&var).unwrap();
67-
output.extend(quote!(.append(&#var.to_owned())));
67+
output.extend(quote!(.append(&#var.into_os_string())));
6868
} else {
6969
output.extend(quote!(.append(&"$")));
7070
}
@@ -238,7 +238,7 @@ impl Lexer {
238238
if s.starts_with('\"') || s.starts_with('r') {
239239
// string literal
240240
let ss = scan_str_lit(&lit);
241-
self.extend_last_arg(quote!(&#ss));
241+
self.extend_last_arg(quote!(&#ss.into_os_string()));
242242
} else {
243243
let mut is_redirect = false;
244244
if s == "1" || s == "2" {
@@ -365,7 +365,7 @@ impl Lexer {
365365
let peek_no_gap = self.iter.peek_no_gap().map(|tt| tt.to_owned());
366366
// let peek_no_gap = None;
367367
if let Some(TokenTree::Ident(var)) = peek_no_gap {
368-
self.extend_last_arg(quote!(&#var.to_owned()));
368+
self.extend_last_arg(quote!(&#var.into_os_string()));
369369
} else if let Some(TokenTree::Group(g)) = peek_no_gap {
370370
if g.delimiter() != Delimiter::Brace && g.delimiter() != Delimiter::Bracket {
371371
abort!(
@@ -382,7 +382,7 @@ impl Lexer {
382382
abort!(span, "more than one variable in grouping");
383383
}
384384
if g.delimiter() == Delimiter::Brace {
385-
self.extend_last_arg(quote!(&#var.to_owned()));
385+
self.extend_last_arg(quote!(&#var.into_os_string()));
386386
} else {
387387
if !self.last_arg_str.is_empty() {
388388
abort!(span, "vector variable can only be used alone");

macros/src/lib.rs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ pub fn use_builtin_cmd(item: proc_macro::TokenStream) -> proc_macro::TokenStream
140140
pub fn run_cmd(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
141141
let cmds = lexer::Lexer::new(input.into()).scan().parse(false);
142142
quote! ({
143+
use ::cmd_lib::IntoOsString;
143144
#cmds.run_cmd()
144145
})
145146
.into()
@@ -161,6 +162,7 @@ pub fn run_cmd(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
161162
pub fn run_fun(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
162163
let cmds = lexer::Lexer::new(input.into()).scan().parse(false);
163164
quote! ({
165+
use ::cmd_lib::IntoOsString;
164166
#cmds.run_fun()
165167
})
166168
.into()
@@ -182,6 +184,7 @@ pub fn run_fun(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
182184
pub fn spawn(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
183185
let cmds = lexer::Lexer::new(input.into()).scan().parse(true);
184186
quote! ({
187+
use ::cmd_lib::IntoOsString;
185188
#cmds.spawn()
186189
})
187190
.into()
@@ -192,23 +195,35 @@ pub fn spawn(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
192195
#[proc_macro_error]
193196
pub fn cmd_error(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
194197
let msg = parse_msg(input.into());
195-
quote!(::cmd_lib::log::error!("{}", #msg)).into()
198+
quote!({
199+
use ::cmd_lib::IntoOsString;
200+
::cmd_lib::log::error!("{}", #msg)
201+
})
202+
.into()
196203
}
197204

198205
/// Logs a message at the warn level with interpolation support
199206
#[proc_macro]
200207
#[proc_macro_error]
201208
pub fn cmd_warn(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
202209
let msg = parse_msg(input.into());
203-
quote!(::cmd_lib::log::warn!("{}", #msg)).into()
210+
quote!({
211+
use ::cmd_lib::IntoOsString;
212+
::cmd_lib::log::warn!("{}", #msg)
213+
})
214+
.into()
204215
}
205216

206217
/// Print a message to stdout with interpolation support
207218
#[proc_macro]
208219
#[proc_macro_error]
209220
pub fn cmd_echo(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
210221
let msg = parse_msg(input.into());
211-
quote!(println!("{}", #msg)).into()
222+
quote!({
223+
use ::cmd_lib::IntoOsString;
224+
println!("{}", #msg)
225+
})
226+
.into()
212227
}
213228

214229
/// Logs a message at the info level with interpolation support
@@ -225,23 +240,35 @@ pub fn cmd_echo(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
225240
#[proc_macro_error]
226241
pub fn cmd_info(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
227242
let msg = parse_msg(input.into());
228-
quote!(::cmd_lib::log::info!("{}", #msg)).into()
243+
quote!({
244+
use ::cmd_lib::IntoOsString;
245+
::cmd_lib::log::info!("{}", #msg)
246+
})
247+
.into()
229248
}
230249

231250
/// Logs a message at the debug level with interpolation support
232251
#[proc_macro]
233252
#[proc_macro_error]
234253
pub fn cmd_debug(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
235254
let msg = parse_msg(input.into());
236-
quote!(::cmd_lib::log::debug!("{}", #msg)).into()
255+
quote!({
256+
use ::cmd_lib::IntoOsString;
257+
::cmd_lib::log::debug!("{}", #msg)
258+
})
259+
.into()
237260
}
238261

239262
/// Logs a message at the trace level with interpolation support
240263
#[proc_macro]
241264
#[proc_macro_error]
242265
pub fn cmd_trace(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
243266
let msg = parse_msg(input.into());
244-
quote!(::cmd_lib::log::trace!("{}", #msg)).into()
267+
quote!({
268+
use ::cmd_lib::IntoOsString;
269+
::cmd_lib::log::trace!("{}", #msg)
270+
})
271+
.into()
245272
}
246273

247274
#[proc_macro]
@@ -263,6 +290,7 @@ pub fn cmd_trace(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
263290
pub fn cmd_die(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
264291
let msg = parse_msg(input.into());
265292
quote!({
293+
use ::cmd_lib::IntoOsString;
266294
::cmd_lib::log::error!("FATAL: {}", #msg);
267295
std::process::exit(1)
268296
})

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,8 @@ pub use child::CmdChildren;
337337
pub use log;
338338
pub use logger::init_builtin_logger;
339339
pub use process::{
340-
export_cmd, set_debug, set_pipefail, Cmd, CmdEnv, CmdString, Cmds, GroupCmds, Redirect,
340+
export_cmd, set_debug, set_pipefail, Cmd, CmdEnv, CmdString, Cmds, GroupCmds, IntoOsString,
341+
Redirect,
341342
};
342343

343344
mod builtins;

src/process.rs

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
#![allow(clippy::wrong_self_convention)]
12
use crate::child::{CmdChild, CmdChildren};
23
use crate::io::{CmdIn, CmdOut};
34
use crate::{builtin_true, CmdResult, FunResult};
45
use faccess::{AccessMode, PathExt};
56
use lazy_static::lazy_static;
67
use log::{debug, error};
78
use os_pipe::{self, PipeReader, PipeWriter};
8-
use std::any::Any;
99
use std::collections::HashMap;
1010
use std::ffi::{OsStr, OsString};
1111
use std::fmt;
@@ -535,36 +535,23 @@ impl Cmd {
535535
}
536536
}
537537

538+
#[doc(hidden)]
539+
pub trait IntoOsString {
540+
fn into_os_string(&self) -> OsString;
541+
}
542+
543+
impl<T: ToString> IntoOsString for T {
544+
fn into_os_string(&self) -> OsString {
545+
OsString::from(self.to_string())
546+
}
547+
}
548+
538549
#[doc(hidden)]
539550
#[derive(Default, Debug)]
540551
pub struct CmdString(OsString);
541552
impl CmdString {
542-
pub fn append<T: Any + fmt::Debug>(mut self, value: &T) -> Self {
543-
let value_any = value as &dyn Any;
544-
if let Some(as_string) = value_any.downcast_ref::<String>() {
545-
self.0.push(as_string);
546-
} else if let Some(as_string) = value_any.downcast_ref::<&String>() {
547-
self.0.push(as_string);
548-
} else if let Some(as_string) = value_any.downcast_ref::<&str>() {
549-
self.0.push(as_string);
550-
} else if let Some(as_os_string) = value_any.downcast_ref::<OsString>() {
551-
self.0.push(as_os_string);
552-
} else if let Some(as_os_string) = value_any.downcast_ref::<&OsString>() {
553-
self.0.push(as_os_string);
554-
} else if let Some(as_os_string) = value_any.downcast_ref::<&OsStr>() {
555-
self.0.push(as_os_string);
556-
} else if let Some(as_path_string) = value_any.downcast_ref::<PathBuf>() {
557-
self.0.push(as_path_string);
558-
} else if let Some(as_path_string) = value_any.downcast_ref::<&PathBuf>() {
559-
self.0.push(as_path_string);
560-
} else if let Some(as_path_string) = value_any.downcast_ref::<&Path>() {
561-
self.0.push(as_path_string);
562-
} else if let Some(as_cmd_string) = value_any.downcast_ref::<Self>() {
563-
self.0.push(&as_cmd_string.0);
564-
} else {
565-
self.0.push(format!("{:?}", value));
566-
}
567-
553+
pub fn append<T: AsRef<OsStr>>(mut self, value: T) -> Self {
554+
self.0.push(value);
568555
self
569556
}
570557

0 commit comments

Comments
 (0)