email-cli 0.1.1

Agent-friendly email CLI for Resend
use anyhow::Result;

use crate::app::App;
use crate::cli::*;
use crate::models::*;
use crate::output::print_success_or;

impl App {
    pub fn contact_list(&self, args: ContactListArgs) -> Result<()> {
        let client = self.default_client()?;
        let contacts = client.list_contacts(&args.audience)?;
        print_success_or(self.format, &contacts, |c| {
            for contact in &c.data {
                let name = match (&contact.first_name, &contact.last_name) {
                    (Some(f), Some(l)) => format!("{} {}", f, l),
                    (Some(f), None) => f.clone(),
                    (None, Some(l)) => l.clone(),
                    (None, None) => String::new(),
                };
                println!("{} {} {}", contact.id, contact.email, name);
            }
        });
        Ok(())
    }

    pub fn contact_get(&self, args: ContactGetArgs) -> Result<()> {
        let client = self.default_client()?;
        let contact = client.get_contact(&args.audience, &args.id)?;
        print_success_or(self.format, &contact, |c| {
            println!("id: {}", c.id);
            println!("email: {}", c.email);
            if let Some(f) = &c.first_name { println!("first_name: {}", f); }
            if let Some(l) = &c.last_name { println!("last_name: {}", l); }
            if let Some(u) = c.unsubscribed { println!("unsubscribed: {}", u); }
        });
        Ok(())
    }

    pub fn contact_create(&self, args: ContactCreateArgs) -> Result<()> {
        let client = self.default_client()?;
        let response = client.create_contact(&args.audience, &CreateContactRequest {
            email: args.email,
            first_name: args.first_name,
            last_name: args.last_name,
            unsubscribed: args.unsubscribed,
        })?;
        print_success_or(self.format, &response, |r| {
            println!("created contact {}", r.id);
        });
        Ok(())
    }

    pub fn contact_update(&self, args: ContactUpdateArgs) -> Result<()> {
        let client = self.default_client()?;
        let contact = client.update_contact(&args.audience, &args.id, &UpdateContactRequest {
            first_name: args.first_name,
            last_name: args.last_name,
            unsubscribed: args.unsubscribed,
        })?;
        print_success_or(self.format, &contact, |c| {
            println!("updated contact {} {}", c.id, c.email);
        });
        Ok(())
    }

    pub fn contact_delete(&self, args: ContactDeleteArgs) -> Result<()> {
        let client = self.default_client()?;
        let response = client.delete_contact(&args.audience, &args.id)?;
        print_success_or(self.format, &response, |r| {
            println!("deleted: {}", r.deleted);
        });
        Ok(())
    }
}