Skip to content

Commit 76923ea

Browse files
committed
config: add List literal
1 parent 83829d2 commit 76923ea

2 files changed

Lines changed: 42 additions & 20 deletions

File tree

watt/config.rs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -393,29 +393,37 @@ pub enum Expression {
393393
}
394394

395395
impl Expression {
396-
pub fn as_number(&self) -> anyhow::Result<f64> {
396+
pub fn try_into_number(&self) -> anyhow::Result<f64> {
397397
let Self::Number(number) = self else {
398398
bail!("tried to cast '{self:?}' to a number, failed")
399399
};
400400

401401
Ok(*number)
402402
}
403403

404-
pub fn as_boolean(&self) -> anyhow::Result<bool> {
404+
pub fn try_into_boolean(&self) -> anyhow::Result<bool> {
405405
let Self::Boolean(boolean) = self else {
406406
bail!("tried to cast '{self:?}' to a boolean, failed")
407407
};
408408

409409
Ok(*boolean)
410410
}
411411

412-
pub fn as_string(&self) -> anyhow::Result<&String> {
412+
pub fn try_into_string(&self) -> anyhow::Result<&String> {
413413
let Self::String(string) = self else {
414414
bail!("tried to cast '{self:?}' to a string, failed")
415415
};
416416

417417
Ok(string)
418418
}
419+
420+
pub fn try_into_list(&self) -> anyhow::Result<&Vec<Expression>> {
421+
let Self::List(list) = self else {
422+
bail!("tried to cast '{self:?}' to a list, failed")
423+
};
424+
425+
Ok(list)
426+
}
419427
}
420428

421429
#[derive(Debug, Clone, PartialEq)]
@@ -495,26 +503,36 @@ impl Expression {
495503
List(result)
496504
},
497505

498-
Plus { a, b } => Number(eval!(a).as_number()? + eval!(b).as_number()?),
499-
Minus { a, b } => Number(eval!(a).as_number()? - eval!(b).as_number()?),
506+
Plus { a, b } => {
507+
Number(eval!(a).try_into_number()? + eval!(b).try_into_number()?)
508+
},
509+
Minus { a, b } => {
510+
Number(eval!(a).try_into_number()? - eval!(b).try_into_number()?)
511+
},
500512
Multiply { a, b } => {
501-
Number(eval!(a).as_number()? * eval!(b).as_number()?)
513+
Number(eval!(a).try_into_number()? * eval!(b).try_into_number()?)
502514
},
503515
Power { a, b } => {
504-
Number(eval!(a).as_number()?.powf(eval!(b).as_number()?))
516+
Number(
517+
eval!(a)
518+
.try_into_number()?
519+
.powf(eval!(b).try_into_number()?),
520+
)
521+
},
522+
Divide { a, b } => {
523+
Number(eval!(a).try_into_number()? / eval!(b).try_into_number()?)
505524
},
506-
Divide { a, b } => Number(eval!(a).as_number()? / eval!(b).as_number()?),
507525

508526
LessThan { a, b } => {
509-
Boolean(eval!(a).as_number()? < eval!(b).as_number()?)
527+
Boolean(eval!(a).try_into_number()? < eval!(b).try_into_number()?)
510528
},
511529
MoreThan { a, b } => {
512-
Boolean(eval!(a).as_number()? > eval!(b).as_number()?)
530+
Boolean(eval!(a).try_into_number()? > eval!(b).try_into_number()?)
513531
},
514532
Equal { a, b, leeway } => {
515-
let a = eval!(a).as_number()?;
516-
let b = eval!(b).as_number()?;
517-
let leeway = eval!(leeway).as_number()?;
533+
let a = eval!(a).try_into_number()?;
534+
let b = eval!(b).try_into_number()?;
535+
let leeway = eval!(leeway).try_into_number()?;
518536

519537
let minimum = a - leeway;
520538
let maximum = a + leeway;
@@ -527,7 +545,7 @@ impl Expression {
527545
consequence,
528546
alternative,
529547
} => {
530-
if eval!(condition).as_boolean()? {
548+
if eval!(condition).try_into_boolean()? {
531549
eval!(consequence)
532550
} else if let Some(alternative) = alternative {
533551
eval!(alternative)
@@ -538,7 +556,9 @@ impl Expression {
538556

539557
IsUnset { a } => Boolean(a.eval(state)?.is_none()),
540558

541-
And { a, b } => Boolean(eval!(a).as_boolean()? && eval!(b).as_boolean()?),
559+
And { a, b } => {
560+
Boolean(eval!(a).try_into_boolean()? && eval!(b).try_into_boolean()?)
561+
},
542562
All { all } => {
543563
let mut all = all.iter();
544564

@@ -547,12 +567,14 @@ impl Expression {
547567
break Boolean(true);
548568
};
549569

550-
if !eval!(value).as_boolean()? {
570+
if !eval!(value).try_into_boolean()? {
551571
break Boolean(false);
552572
}
553573
}
554574
},
555-
Or { a, b } => Boolean(eval!(a).as_boolean()? || eval!(b).as_boolean()?),
575+
Or { a, b } => {
576+
Boolean(eval!(a).try_into_boolean()? || eval!(b).try_into_boolean()?)
577+
},
556578
Any { any } => {
557579
let mut any = any.iter();
558580

@@ -561,12 +583,12 @@ impl Expression {
561583
break Boolean(false);
562584
};
563585

564-
if eval!(value).as_boolean()? {
586+
if eval!(value).try_into_boolean()? {
565587
break Boolean(true);
566588
}
567589
}
568590
},
569-
Not { not } => Boolean(!eval!(not).as_boolean()?),
591+
Not { not } => Boolean(!eval!(not).try_into_boolean()?),
570592
}))
571593
}
572594
}

watt/daemon.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ pub fn run(config: config::DaemonConfig) -> anyhow::Result<()> {
455455
}
456456

457457
// TODO: Also merge this into one like CPU.
458-
if condition.as_boolean()? {
458+
if condition.try_into_boolean()? {
459459
rule.power.apply()?;
460460
}
461461
}

0 commit comments

Comments
 (0)