Skip to content

Commit af90b70

Browse files
committed
simplify unit in quantity, remove once_cell and either dependency
1 parent 970d926 commit af90b70

File tree

11 files changed

+96
-204
lines changed

11 files changed

+96
-204
lines changed

Cargo.lock

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ bitflags = { version = "2", features = ["serde"] }
1515
serde = { version = "1", features = ["derive", "rc"] }
1616
strum = { version = "0.26.1", features = ["derive"] }
1717
thiserror = "2"
18-
once_cell = "1"
1918
enum-map = { version = "2", features = ["serde"] }
2019
tracing = "0.1"
2120
codesnake = "0.2.1"
2221
unicode-width = "0.2"
23-
either = "1.8"
2422
finl_unicode = { version = "1.2", features = ["categories"], default-features = false }
2523
smallvec = { version = "1" }
2624
unicase = "2.7.0"

bindings/src/model.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ trait Amountable {
176176

177177
impl Amountable for OriginalQuantity<OriginalScalableValue> {
178178
fn extract_amount(&self) -> Amount {
179-
let quantity = extract_quantity(&self.value);
179+
let quantity = extract_quantity(self.value());
180180

181181
let units = self.unit().as_ref().map(|u| u.to_string());
182182

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ fn generate_bundled() {
195195
})
196196
.unwrap_or_else(none);
197197

198-
let extend = if let Some(_) = uf.get("extend") {
198+
let extend = if uf.get("extend").is_some() {
199199
unimplemented!("base units.toml does not have extend");
200200
} else {
201201
quote! { None }

src/analysis/event_consumer.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::parser::{
99
self, BlockKind, Event, IntermediateData, IntermediateRefMode, IntermediateTargetKind,
1010
Modifiers,
1111
};
12-
use crate::quantity::{Quantity, QuantityValue, ScalableValue, UnitInfo, Value};
12+
use crate::quantity::{Quantity, QuantityValue, ScalableValue, Value};
1313
use crate::span::Span;
1414
use crate::text::Text;
1515
use crate::{model::*, Extensions, ParseOptions};
@@ -653,14 +653,15 @@ impl<'i> RecipeCollector<'i, '_> {
653653
.unwrap_or(new_q_loc.span());
654654

655655
let (main_label, support_label) = match &e {
656-
crate::quantity::IncompatibleUnits::MissingUnit { found } => {
656+
crate::quantity::IncompatibleUnits::MissingUnit { lhs, .. } => {
657657
let m = "value missing unit";
658658
let f = "found unit";
659-
match found {
659+
if *lhs {
660660
// new is mising
661-
either::Either::Left(_) => (label!(new, m), label!(old, f)),
661+
(label!(new, m), label!(old, f))
662+
} else {
662663
// old is missing
663-
either::Either::Right(_) => (label!(new, f), label!(old, m)),
664+
(label!(new, f), label!(old, m))
664665
}
665666
}
666667
crate::quantity::IncompatibleUnits::DifferentPhysicalQuantities {
@@ -723,8 +724,8 @@ impl<'i> RecipeCollector<'i, '_> {
723724
if let Some((ref_q, def_q)) =
724725
&new_igr.quantity.as_ref().zip(definition.quantity.as_ref())
725726
{
726-
let ref_is_text = ref_q.value.is_text();
727-
let def_is_text = def_q.value.is_text();
727+
let ref_is_text = ref_q.value().is_text();
728+
let def_is_text = def_q.value().is_text();
728729

729730
if ref_is_text != def_is_text {
730731
let ref_q_loc = located_ingredient.quantity.as_ref().unwrap().span();
@@ -974,16 +975,16 @@ impl<'i> RecipeCollector<'i, '_> {
974975
let quantity = self.quantity(q, false);
975976
if self.extensions.contains(Extensions::ADVANCED_UNITS) {
976977
let located_quantity = located_timer.quantity.as_ref().unwrap();
977-
if quantity.value.is_text() {
978+
if quantity.value().is_text() {
978979
self.ctx.error(error!(
979-
format!("Timer value is text: {}", quantity.value),
980+
format!("Timer value is text: {}", quantity.value()),
980981
label!(located_quantity.value.span(), "expected a number here")
981982
));
982983
}
983-
if let Some(unit) = quantity.unit() {
984+
if let Some(unit_text) = quantity.unit() {
984985
let unit_span = located_quantity.unit.as_ref().unwrap().span();
985-
match unit.unit_info_or_parse(self.converter) {
986-
UnitInfo::Known(unit) => {
986+
match quantity.unit_info(self.converter) {
987+
Some(unit) => {
987988
if unit.physical_quantity != PhysicalQuantity::Time {
988989
self.ctx.error(error!(
989990
format!("Timer unit is not time: {unit}"),
@@ -995,8 +996,8 @@ impl<'i> RecipeCollector<'i, '_> {
995996
));
996997
}
997998
}
998-
UnitInfo::Unknown => self.ctx.error(error!(
999-
format!("Unknown timer unit: {unit}"),
999+
None => self.ctx.error(error!(
1000+
format!("Unknown timer unit: {unit_text}"),
10001001
label!(unit_span, "expected time unit")
10011002
)),
10021003
}
@@ -1377,7 +1378,7 @@ fn find_inline_quantity<'a>(
13771378

13781379
fn eat_word<'a>(text: &'a str, i: &mut usize) -> Option<&'a str> {
13791380
let s = &text[*i..];
1380-
let offset = s.find(|c: char| c.is_whitespace()).or_else(|| {
1381+
let offset = s.find(|c: char| c.is_whitespace()).or({
13811382
// if no whitespace until the end if there is anything left
13821383
if !s.is_empty() {
13831384
Some(s.len())
@@ -1439,16 +1440,15 @@ fn find_inline_quantity<'a>(
14391440
let Ok(mut number) = number.parse::<f64>() else {
14401441
continue;
14411442
};
1442-
let Some(parsed_unit) = converter.find_unit(unit) else {
1443+
if converter.find_unit(unit).is_none() {
14431444
continue;
14441445
};
14451446

14461447
if neg {
14471448
number = -number;
14481449
}
14491450

1450-
let q =
1451-
Quantity::with_text_and_known_unit(Value::from(number), unit.to_string(), parsed_unit);
1451+
let q = Quantity::new(Value::from(number), Some(unit.to_string()));
14521452
return Some((before, q, after));
14531453
}
14541454

src/convert/mod.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use thiserror::Error;
1313

1414
use crate::{
1515
quantity::{Number, Quantity, ScaledQuantity, Value},
16-
ScaledRecipe, UnitInfo,
16+
ScaledRecipe,
1717
};
1818

1919
pub use builder::{ConverterBuilder, ConverterBuilderError};
@@ -463,24 +463,27 @@ impl ScaledQuantity {
463463

464464
#[tracing::instrument(level = "trace", name = "convert", skip_all)]
465465
fn convert_impl(&mut self, to: ConvertTo, converter: &Converter) -> Result<(), ConvertError> {
466-
let unit_info = self.unit().map(|u| u.unit_info_or_parse(converter));
466+
if self.unit().is_none() {
467+
return Err(ConvertError::NoUnit(self.clone()));
468+
}
469+
470+
let unit_info = self.unit_info(converter);
467471
let original_system;
468472
let unit = match unit_info {
469-
Some(UnitInfo::Known(ref u)) => {
473+
Some(ref u) => {
470474
original_system = u.system;
471475
ConvertUnit::Unit(u)
472476
}
473-
Some(UnitInfo::Unknown) => {
477+
None => {
474478
return Err(ConvertError::UnknownUnit(UnknownUnit(
475-
self.unit_text().unwrap().to_string(),
479+
self.unit().unwrap().to_string(),
476480
)))
477481
}
478-
None => return Err(ConvertError::NoUnit(self.clone())),
479482
};
480-
let value = ConvertValue::try_from(&self.value)?;
483+
let value = ConvertValue::try_from(self.value())?;
481484

482485
let (new_value, new_unit) = converter.convert(value, unit, to)?;
483-
*self = Quantity::with_known_unit(new_value.into(), Arc::clone(&new_unit));
486+
*self = Quantity::new(new_value.into(), Some(new_unit.symbol().to_string()));
484487
match to {
485488
ConvertTo::Unit(_) => {
486489
self.try_fraction(converter);
@@ -501,8 +504,7 @@ impl ScaledQuantity {
501504
#[tracing::instrument(level = "trace", skip_all)]
502505
pub fn fit(&mut self, converter: &Converter) -> Result<(), ConvertError> {
503506
// only known units can be fitted
504-
let Some(UnitInfo::Known(unit)) = self.unit().map(|u| u.unit_info_or_parse(converter))
505-
else {
507+
let Some(unit) = self.unit_info(converter) else {
506508
return Ok(());
507509
};
508510

@@ -540,7 +542,7 @@ impl ScaledQuantity {
540542
return Ok(self.try_fraction(converter)); // no system, just keep the same unit
541543
};
542544

543-
let value = match self.value {
545+
let value = match self.value() {
544546
Value::Number(n) => n.value(),
545547
Value::Range { start, .. } => start.value(),
546548
Value::Text(ref t) => return Err(ConvertError::TextValue(t.clone())),
@@ -581,7 +583,7 @@ impl ScaledQuantity {
581583
return Ok(false);
582584
};
583585

584-
let new_value = match self.value {
586+
let new_value = match self.value() {
585587
Value::Number(_) => Value::Number(new_value),
586588
Value::Range { end, .. } => {
587589
let end = converter.convert_f64(end.value(), unit, new_unit);
@@ -594,7 +596,7 @@ impl ScaledQuantity {
594596
}
595597
Value::Text(_) => unreachable!(),
596598
};
597-
*self = Quantity::with_known_unit(new_value, Arc::clone(new_unit));
599+
*self = Quantity::new(new_value, Some(new_unit.symbol().to_string()));
598600
Ok(true)
599601
}
600602

@@ -604,8 +606,7 @@ impl ScaledQuantity {
604606
#[tracing::instrument(level = "trace", skip_all)]
605607
pub fn try_fraction(&mut self, converter: &Converter) -> bool {
606608
// only known units can be fitted
607-
let Some(UnitInfo::Known(unit)) = self.unit().map(|u| u.unit_info_or_parse(converter))
608-
else {
609+
let Some(unit) = self.unit_info(converter) else {
609610
return false;
610611
};
611612

@@ -614,7 +615,7 @@ impl ScaledQuantity {
614615
return false;
615616
}
616617

617-
match &mut self.value {
618+
match self.value_mut() {
618619
Value::Number(n) => n.try_approx(cfg.accuracy, cfg.max_denominator, cfg.max_whole),
619620
Value::Range { start, end } => {
620621
start.try_approx(cfg.accuracy, cfg.max_denominator, cfg.max_whole)

src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ pub use metadata::Metadata;
9696
pub use model::*;
9797
pub use parser::Modifiers;
9898
pub use quantity::{
99-
GroupedQuantity, Quantity, QuantityUnit, ScalableQuantity, ScalableValue, ScaledQuantity,
100-
UnitInfo, Value,
99+
GroupedQuantity, Quantity, ScalableQuantity, ScalableValue, ScaledQuantity, Value,
101100
};
102101
pub use span::Span;
103102
pub use text::Text;

src/metadata.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ impl NameAndUrl {
613613
pub fn parse(s: &str) -> Self {
614614
if let Some(s) = s.trim_ascii_end().strip_suffix('>') {
615615
if let Some((name, url)) = s.split_once('<') {
616-
if !url.trim().is_empty() && !url.contains(&['<', '>']) {
616+
if !url.trim().is_empty() && !url.contains(['<', '>']) {
617617
return Self::new(Some(name), Some(url));
618618
}
619619
}
@@ -753,7 +753,7 @@ fn parse_common_time_format(s: &str) -> Option<u32> {
753753
if it.next().is_some() {
754754
return None;
755755
}
756-
return Some(total_minutes);
756+
Some(total_minutes)
757757
}
758758

759759
fn parse_time_with_units(s: &str, converter: &Converter) -> Result<u32, ParseTimeError> {

0 commit comments

Comments
 (0)