Browse Source

Move quantity-formatting to main crate

David Peter 2 years ago
parent
commit
a0d780aceb
2 changed files with 25 additions and 16 deletions
  1. 2 16
      numbat-cli/src/main.rs
  2. 23 0
      numbat/src/quantity.rs

+ 2 - 16
numbat-cli/src/main.rs

@@ -4,7 +4,6 @@ mod completion;
 use ansi_formatter::ANSIFormatter;
 use completion::NumbatCompleter;
 
-use numbat::markup;
 use numbat::pretty_print::PrettyPrint;
 use numbat::{markup::Formatter, Context, ExitStatus, InterpreterResult, NumbatError, ParseError};
 
@@ -216,21 +215,8 @@ impl Cli {
                     InterpreterResult::Quantity(quantity) => {
                         println!();
 
-                        let formatted_number = format!("{:.6}", quantity.unsafe_value().to_f64());
-                        let formatted_number = formatted_number.trim_end_matches('0');
-                        let formatted_number = if formatted_number.ends_with('.') {
-                            format!("{}0", formatted_number)
-                        } else {
-                            formatted_number.to_string()
-                        };
-
-                        let output_markup = markup::text("    ")
-                            + markup::operator("=")
-                            + markup::text(" ")
-                            + markup::value(formatted_number)
-                            + markup::text(" ")
-                            + markup::unit(format!("{}", quantity.unit()));
-                        println!("{}", ANSIFormatter {}.format(&output_markup, false));
+                        let q_markup = quantity.pretty_print();
+                        println!("{}", ANSIFormatter {}.format(&q_markup, false));
                         println!();
 
                         ControlFlow::Continue(())

+ 23 - 0
numbat/src/quantity.rs

@@ -1,5 +1,6 @@
 use crate::arithmetic::{Power, Rational};
 use crate::number::Number;
+use crate::pretty_print::PrettyPrint;
 use crate::unit::{Unit, UnitFactor};
 
 use itertools::Itertools;
@@ -255,6 +256,28 @@ impl std::fmt::Display for Quantity {
     }
 }
 
+impl PrettyPrint for Quantity {
+    fn pretty_print(&self) -> crate::markup::Markup {
+        use crate::markup;
+
+        let formatted_number = format!("{:.6}", self.unsafe_value().to_f64());
+        let formatted_number = formatted_number.trim_end_matches('0');
+        let formatted_number = if formatted_number.ends_with('.') {
+            format!("{}0", formatted_number)
+        } else {
+            formatted_number.to_string()
+        };
+
+        let output_markup = markup::text("    ")
+            + markup::operator("=")
+            + markup::text(" ")
+            + markup::value(formatted_number)
+            + markup::text(" ")
+            + markup::unit(format!("{}", self.unit()));
+        output_markup
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use crate::prefix::Prefix;