@@ -9,7 +9,7 @@ use crate::parser::{
99 self , BlockKind , Event , IntermediateData , IntermediateRefMode , IntermediateTargetKind ,
1010 Modifiers ,
1111} ;
12- use crate :: quantity:: { Quantity , QuantityValue , ScalableValue , Value } ;
12+ use crate :: quantity:: { Quantity , Value } ;
1313use crate :: span:: Span ;
1414use crate :: text:: Text ;
1515use crate :: { model:: * , Extensions , ParseOptions } ;
@@ -61,14 +61,13 @@ pub fn parse_events<'i, 'c>(
6161 converter,
6262 parse_options,
6363
64- content : ScalableRecipe {
64+ content : Recipe {
6565 metadata : Default :: default ( ) ,
6666 sections : Default :: default ( ) ,
6767 ingredients : Default :: default ( ) ,
6868 cookware : Default :: default ( ) ,
6969 timers : Default :: default ( ) ,
7070 inline_quantities : Default :: default ( ) ,
71- data : crate :: scale:: Servings ( None ) ,
7271 } ,
7372 current_section : Section :: default ( ) ,
7473
@@ -90,7 +89,7 @@ struct RecipeCollector<'i, 'c> {
9089 converter : & ' c Converter ,
9190 parse_options : ParseOptions < ' c > ,
9291
93- content : ScalableRecipe ,
92+ content : Recipe ,
9493 current_section : Section ,
9594
9695 define_mode : DefineMode ,
@@ -265,22 +264,18 @@ impl<'i> RecipeCollector<'i, '_> {
265264 continue ;
266265 }
267266 if let Some ( sk) = key. as_str ( ) . and_then ( |s| StdKey :: from_str ( s) . ok ( ) ) {
268- match check_std_entry ( sk, value, self . converter ) {
269- Ok ( Some ( servings) ) => self . content . data = servings,
270- Ok ( None ) => { }
271- Err ( err) => {
272- let mut diag = warning ! ( format!(
273- "Unsupported value for key: '{}'" ,
274- key. as_str( ) . unwrap( )
275- ) )
276- . set_source ( err) ;
277- if let Some ( key_s) = key. as_str ( ) {
278- if let Some ( pos) = yaml_find_key_position ( & yaml_str, key_s) {
279- diag. add_label ( label ! ( Span :: pos( yaml_text. span( ) . start( ) + pos) ) ) ;
280- }
267+ if let Err ( err) = check_std_entry ( sk, value, self . converter ) {
268+ let mut diag = warning ! ( format!(
269+ "Unsupported value for key: '{}'" ,
270+ key. as_str( ) . unwrap( )
271+ ) )
272+ . set_source ( err) ;
273+ if let Some ( key_s) = key. as_str ( ) {
274+ if let Some ( pos) = yaml_find_key_position ( & yaml_str, key_s) {
275+ diag. add_label ( label ! ( Span :: pos( yaml_text. span( ) . start( ) + pos) ) ) ;
281276 }
282- self . ctx . warn ( diag) ;
283277 }
278+ self . ctx . warn ( diag) ;
284279 }
285280 }
286281 }
@@ -364,9 +359,7 @@ impl<'i> RecipeCollector<'i, '_> {
364359 format!( "Unknown config metadata key: {key_t}" ) ,
365360 label!( key. span( ) )
366361 )
367- . hint (
368- "Possible config keys are '[mode]' and '[duplicate]''" ,
369- ) ,
362+ . hint ( "Possible config keys are '[mode]' and '[duplicate]''" ) ,
370363 ) ;
371364 if self . old_style_metadata {
372365 self . content . metadata . map . insert (
@@ -413,21 +406,17 @@ impl<'i> RecipeCollector<'i, '_> {
413406 self . converter ,
414407 ) ;
415408
416- match check_result {
417- Ok ( Some ( servings) ) => self . content . data = servings,
418- Ok ( None ) => { }
419- Err ( err) => {
420- self . ctx . warn (
421- warning ! (
422- format!( "Unsupported value for key: '{}'" , key. text_trimmed( ) ) ,
423- label!( value. span( ) , "this value" ) ,
424- )
425- . label ( label ! ( key. span( ) , "this key does not support" ) )
426- . hint ( "It will be a regular metadata entry" )
427- . set_source ( err) ,
428- ) ;
429- return ;
430- }
409+ if let Err ( err) = check_result {
410+ self . ctx . warn (
411+ warning ! (
412+ format!( "Unsupported value for key: '{}'" , key. text_trimmed( ) ) ,
413+ label!( value. span( ) , "this value" ) ,
414+ )
415+ . label ( label ! ( key. span( ) , "this key does not support" ) )
416+ . hint ( "It will be a regular metadata entry" )
417+ . set_source ( err) ,
418+ ) ;
419+ return ;
431420 }
432421
433422 // store it's location if it was inserted
@@ -896,7 +885,7 @@ impl<'i> RecipeCollector<'i, '_> {
896885 let mut new_cw = Cookware {
897886 name : cookware. name . text_trimmed ( ) . into_owned ( ) ,
898887 alias : cookware. alias . map ( |t| t. text_trimmed ( ) . into_owned ( ) ) ,
899- quantity : cookware. quantity . map ( |q| self . value ( q . into_inner ( ) , false ) ) ,
888+ quantity : cookware. quantity . clone ( ) . map ( |q| self . quantity ( q , false ) ) ,
900889 note : cookware. note . map ( |n| n. text_trimmed ( ) . into_owned ( ) ) ,
901890 modifiers : cookware. modifiers . into_inner ( ) ,
902891 relation : ComponentRelation :: Definition {
@@ -940,8 +929,8 @@ impl<'i> RecipeCollector<'i, '_> {
940929 if let Some ( ( ref_q, def_q) ) =
941930 & new_cw. quantity . as_ref ( ) . zip ( definition. quantity . as_ref ( ) )
942931 {
943- let ref_is_text = ref_q. is_text ( ) ;
944- let def_is_text = def_q. is_text ( ) ;
932+ let ref_is_text = ref_q. value ( ) . is_text ( ) ;
933+ let def_is_text = def_q. value ( ) . is_text ( ) ;
945934
946935 if ref_is_text != def_is_text {
947936 let ref_q_loc = located_cookware. quantity . as_ref ( ) . unwrap ( ) . span ( ) ;
@@ -1020,22 +1009,27 @@ impl<'i> RecipeCollector<'i, '_> {
10201009 & mut self ,
10211010 quantity : Located < parser:: Quantity < ' i > > ,
10221011 is_ingredient : bool ,
1023- ) -> Quantity < ScalableValue > {
1012+ ) -> Quantity {
10241013 let parser:: Quantity { value, unit, .. } = quantity. into_inner ( ) ;
1025- Quantity :: new (
1026- self . value ( value, is_ingredient) ,
1027- unit. map ( |t| t. text_trimmed ( ) . into_owned ( ) ) ,
1028- )
1014+ let ( value, scalable) = self . value ( value, is_ingredient) ;
1015+ Quantity {
1016+ value,
1017+ unit : unit. map ( |t| t. text_trimmed ( ) . into_owned ( ) ) ,
1018+ scalable,
1019+ }
10291020 }
10301021
1031- fn value ( & mut self , value : parser:: QuantityValue , is_ingredient : bool ) -> ScalableValue {
1032- let parser:: QuantityValue { value, scaling_lock } = value;
1022+ fn value ( & mut self , value : parser:: QuantityValue , is_ingredient : bool ) -> ( Value , bool ) {
1023+ let parser:: QuantityValue {
1024+ value,
1025+ scaling_lock,
1026+ } = value;
10331027 let has_scaling_lock = scaling_lock. is_some ( ) ;
10341028 let is_text = value. is_text ( ) ;
10351029
1036- // For ingredients without text values and without scaling lock, use Linear
1030+ // For ingredients without text values and without scaling lock, enable scaling
10371031 if is_ingredient && !is_text && !has_scaling_lock {
1038- return ScalableValue :: Linear ( value. into_inner ( ) ) ;
1032+ return ( value. into_inner ( ) , true ) ;
10391033 }
10401034
10411035 // Warn if scaling lock is used unnecessarily (on non-ingredients or text values)
@@ -1054,8 +1048,8 @@ impl<'i> RecipeCollector<'i, '_> {
10541048 self . ctx . warn ( warning) ;
10551049 }
10561050
1057- // Everything else uses Fixed
1058- ScalableValue :: Fixed ( value. into_inner ( ) )
1051+ // Everything else doesn't scale
1052+ ( value. into_inner ( ) , false )
10591053 }
10601054
10611055 fn resolve_reference < C : RefComponent > (
@@ -1229,10 +1223,10 @@ trait RefComponent: Sized {
12291223 fn set_reference ( & mut self , references_to : usize ) ;
12301224 fn set_referenced_from ( all : & mut [ Self ] , references_to : usize ) ;
12311225
1232- fn all ( content : & ScalableRecipe ) -> & [ Self ] ;
1226+ fn all ( content : & Recipe ) -> & [ Self ] ;
12331227}
12341228
1235- impl RefComponent for Ingredient < ScalableValue > {
1229+ impl RefComponent for Ingredient {
12361230 #[ inline]
12371231 fn name ( & self ) -> & str {
12381232 & self . name
@@ -1275,12 +1269,12 @@ impl RefComponent for Ingredient<ScalableValue> {
12751269 }
12761270
12771271 #[ inline]
1278- fn all ( content : & ScalableRecipe ) -> & [ Self ] {
1272+ fn all ( content : & Recipe ) -> & [ Self ] {
12791273 & content. ingredients
12801274 }
12811275}
12821276
1283- impl RefComponent for Cookware < ScalableValue > {
1277+ impl RefComponent for Cookware {
12841278 #[ inline]
12851279 fn name ( & self ) -> & str {
12861280 & self . name
@@ -1322,15 +1316,15 @@ impl RefComponent for Cookware<ScalableValue> {
13221316 }
13231317
13241318 #[ inline]
1325- fn all ( content : & ScalableRecipe ) -> & [ Self ] {
1319+ fn all ( content : & Recipe ) -> & [ Self ] {
13261320 & content. cookware
13271321 }
13281322}
13291323
13301324fn find_inline_quantity < ' a > (
13311325 text : & ' a str ,
13321326 converter : & Converter ,
1333- ) -> Option < ( & ' a str , Quantity < Value > , & ' a str ) > {
1327+ ) -> Option < ( & ' a str , Quantity , & ' a str ) > {
13341328 let mut i = 0 ;
13351329
13361330 fn eat_word < ' a > ( text : & ' a str , i : & mut usize ) -> Option < & ' a str > {
@@ -1496,13 +1490,17 @@ fn yaml_find_key_position(text: &str, key: &str) -> Option<usize> {
14961490}
14971491
14981492fn parse_reference ( name : & str ) -> Option < RecipeReference > {
1499- if name. starts_with ( "./" ) || name. starts_with ( "../" ) || name. starts_with ( ".\\ " ) || name. starts_with ( "..\\ " ) {
1493+ if name. starts_with ( "./" )
1494+ || name. starts_with ( "../" )
1495+ || name. starts_with ( ".\\ " )
1496+ || name. starts_with ( "..\\ " )
1497+ {
15001498 let path = name. replace ( '\\' , "/" ) ;
15011499 let mut components: Vec < String > = path. split ( '/' ) . map ( String :: from) . skip ( 1 ) . collect ( ) ;
15021500 let file_stem = components. pop ( ) . unwrap ( ) ;
15031501 Some ( RecipeReference {
15041502 components,
1505- name : file_stem. into ( )
1503+ name : file_stem. into ( ) ,
15061504 } )
15071505 } else {
15081506 None
@@ -1553,7 +1551,11 @@ mod tests {
15531551 assert_eq ! (
15541552 parse_reference( "./recipes/italian/pasta/spaghetti" ) ,
15551553 Some ( RecipeReference {
1556- components: vec![ "recipes" . to_string( ) , "italian" . to_string( ) , "pasta" . to_string( ) ] ,
1554+ components: vec![
1555+ "recipes" . to_string( ) ,
1556+ "italian" . to_string( ) ,
1557+ "pasta" . to_string( )
1558+ ] ,
15571559 name: "spaghetti" . into( )
15581560 } )
15591561 ) ;
0 commit comments