From e9d6aa2e31d4965887d0b106242e0f2734bc207b Mon Sep 17 00:00:00 2001 From: James McDonald Date: Fri, 1 May 2026 14:52:09 +0200 Subject: [PATCH] Add tryfrom for Lookups --- src/main.rs | 17 ++--------------- src/ynab.rs | 12 ++++++++++++ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index abc286e..d8f3ac7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -85,21 +85,8 @@ fn main() -> Result<(), Box> { } => { inputs = inp; - let output_plan = if let Some(plan) = plan { - Ok(ynab::Lookup::Name(plan)) - } else if let Some(plan_id) = plan_id { - Ok(ynab::Lookup::Id(plan_id)) - } else { - Err("no plan name or id".to_string()) - }?; - - let output_account = if let Some(account) = account { - Ok(ynab::Lookup::Name(account)) - } else if let Some(account_id) = account_id { - Ok(ynab::Lookup::Id(account_id)) - } else { - Err("no account name or id".to_string()) - }?; + let output_plan = ynab::Lookup::try_from((plan, plan_id))?; + let output_account = ynab::Lookup::try_from((account, account_id))?; Output::Ynab { token, diff --git a/src/ynab.rs b/src/ynab.rs index 5ed9ae8..bbdebbe 100644 --- a/src/ynab.rs +++ b/src/ynab.rs @@ -138,6 +138,18 @@ pub enum Lookup { Id(String), } +impl TryFrom<(Option, Option)> for Lookup { + type Error = String; + + fn try_from((name, id): (Option, Option)) -> Result { + match (name, id) { + (Some(name), _) => Ok(Lookup::Name(name)), + (_, Some(id)) => Ok(Lookup::Id(id)), + _ => Err("must provide name or id".to_owned()), + } + } +} + pub struct Ynab { client: YnabClient, plan_id: String,