mirror of
https://github.com/nushell/nushell
synced 2024-12-27 21:43:09 +00:00
Allow integer to char -u
(#5174)
This commit is contained in:
parent
3783c19d02
commit
cfefb65d55
1 changed files with 16 additions and 6 deletions
|
@ -192,6 +192,11 @@ impl Command for Char {
|
||||||
example: r#"char -u 1f378"#,
|
example: r#"char -u 1f378"#,
|
||||||
result: Some(Value::test_string("\u{1f378}")),
|
result: Some(Value::test_string("\u{1f378}")),
|
||||||
},
|
},
|
||||||
|
Example {
|
||||||
|
description: "Output a character from an integer",
|
||||||
|
example: r#"char -u 0x61"#,
|
||||||
|
result: Some(Value::test_string("a")),
|
||||||
|
},
|
||||||
Example {
|
Example {
|
||||||
description: "Output multi-byte Unicode character",
|
description: "Output multi-byte Unicode character",
|
||||||
example: r#"char -u 1F468 200D 1F466 200D 1F466"#,
|
example: r#"char -u 1F468 200D 1F466 200D 1F466"#,
|
||||||
|
@ -235,8 +240,8 @@ impl Command for Char {
|
||||||
.into_pipeline_data(engine_state.ctrlc.clone()));
|
.into_pipeline_data(engine_state.ctrlc.clone()));
|
||||||
}
|
}
|
||||||
// handle -u flag
|
// handle -u flag
|
||||||
let args: Vec<String> = call.rest(engine_state, stack, 0)?;
|
|
||||||
if call.has_flag("unicode") {
|
if call.has_flag("unicode") {
|
||||||
|
let args: Vec<Value> = call.rest(engine_state, stack, 0)?;
|
||||||
if args.is_empty() {
|
if args.is_empty() {
|
||||||
return Err(ShellError::MissingParameter(
|
return Err(ShellError::MissingParameter(
|
||||||
"missing at least one unicode character".into(),
|
"missing at least one unicode character".into(),
|
||||||
|
@ -249,10 +254,11 @@ impl Command for Char {
|
||||||
.positional_nth(i)
|
.positional_nth(i)
|
||||||
.expect("Unexpected missing argument")
|
.expect("Unexpected missing argument")
|
||||||
.span;
|
.span;
|
||||||
multi_byte.push(string_to_unicode_char(arg, &span)?)
|
multi_byte.push(value_to_unicode_char(arg, &span)?)
|
||||||
}
|
}
|
||||||
Ok(Value::string(multi_byte, call_span).into_pipeline_data())
|
Ok(Value::string(multi_byte, call_span).into_pipeline_data())
|
||||||
} else {
|
} else {
|
||||||
|
let args: Vec<String> = call.rest(engine_state, stack, 0)?;
|
||||||
if args.is_empty() {
|
if args.is_empty() {
|
||||||
return Err(ShellError::MissingParameter(
|
return Err(ShellError::MissingParameter(
|
||||||
"missing name of the character".into(),
|
"missing name of the character".into(),
|
||||||
|
@ -274,10 +280,14 @@ impl Command for Char {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn string_to_unicode_char(s: &str, t: &Span) -> Result<char, ShellError> {
|
fn value_to_unicode_char(value: &Value, t: &Span) -> Result<char, ShellError> {
|
||||||
let decoded_char = u32::from_str_radix(s, 16)
|
let decoded_char = match *value {
|
||||||
.ok()
|
Value::String { ref val, .. } => u32::from_str_radix(val, 16)
|
||||||
.and_then(std::char::from_u32);
|
.ok()
|
||||||
|
.and_then(std::char::from_u32),
|
||||||
|
Value::Int { val, .. } => val.try_into().ok().and_then(std::char::from_u32),
|
||||||
|
_ => return Err(ShellError::TypeMismatch("string or int".to_owned(), *t)),
|
||||||
|
};
|
||||||
|
|
||||||
if let Some(ch) = decoded_char {
|
if let Some(ch) = decoded_char {
|
||||||
Ok(ch)
|
Ok(ch)
|
||||||
|
|
Loading…
Reference in a new issue