diff --git a/common/src/format.rs b/common/src/format.rs index 6f6fc661e..5ebbe107d 100644 --- a/common/src/format.rs +++ b/common/src/format.rs @@ -608,7 +608,8 @@ impl FormatSpec { .map_err(|msg| msg.to_owned()) } - pub fn format_string(&self, s: &BorrowedStr) -> Result { + pub fn format_string(&self, s: &BorrowedStr) -> Result { + self.validate_format(FormatType::String)?; match self.format_type { Some(FormatType::String) | None => self .format_sign_and_align(s, "", FormatAlign::Left) @@ -617,8 +618,15 @@ impl FormatSpec { value.truncate(precision); } value - }), - _ => Err("Unknown format code for object of type 'str'"), + }) + .map_err(|msg| msg.to_owned()), + _ => { + let ch = char::from(self.format_type.as_ref().unwrap()); + Err(format!( + "Unknown format code '{}' for object of type 'str'", + ch + )) + } } } diff --git a/vm/src/builtins/str.rs b/vm/src/builtins/str.rs index 443f61502..83e2581d5 100644 --- a/vm/src/builtins/str.rs +++ b/vm/src/builtins/str.rs @@ -730,9 +730,11 @@ impl PyStr { #[pymethod(name = "__format__")] fn format_str(&self, spec: PyStrRef, vm: &VirtualMachine) -> PyResult { - FormatSpec::parse(spec.as_str()) - .and_then(|format_spec| format_spec.format_string(self.borrow())) - .map_err(|err| vm.new_value_error(err.to_string())) + let format_spec = + FormatSpec::parse(spec.as_str()).map_err(|err| vm.new_value_error(err.to_string()))?; + format_spec + .format_string(self.borrow()) + .map_err(|msg| vm.new_value_error(msg)) } /// Return a titlecased version of the string where words start with an