tidy-browser 0.3.4

Tidy up browser information.
Documentation
use std::{collections::HashSet, fmt::Display, path::PathBuf};

use decrypt_cookies::prelude::{SafariBuilder, SafariGetter};
use snafu::ResultExt;

use crate::{
    args::{Format, Value},
    error::{self, Result},
    utils,
};

#[derive(Clone, Copy)]
#[derive(Debug)]
#[derive(Default)]
#[derive(PartialEq, Eq, PartialOrd, Ord)]
pub struct SafariBased;

impl SafariBased {
    pub async fn write_data<C, H, S>(
        values: HashSet<Value>,
        cookies_path: C,
        host: H,
        sep: S,
        mut output_dir: PathBuf,
        format: Format,
    ) -> Result<()>
    where
        C: Into<Option<PathBuf>>,
        H: Into<Option<String>>,
        S: Display + Send + Clone + 'static,
    {
        let safari = if let Some(path) = cookies_path.into() {
            let mut safari_builder = SafariBuilder::new();
            safari_builder.cookies_path(path);
            safari_builder
        }
        else {
            SafariBuilder::new()
        }
        .build()
        .await
        .context(error::SafariSnafu)?;
        let host: Option<String> = host.into();

        if values.contains(&Value::Cookie) {
            let cookies = if let Some(host) = &host {
                safari
                    .cookies_by_host(host)
                    .cloned()
                    .collect()
            }
            else {
                safari.cookies_all().to_vec()
            };

            output_dir.push(SafariGetter::NAME);

            tokio::fs::create_dir_all(&output_dir)
                .await
                .with_context(|_| error::IoSnafu { path: output_dir.clone() })?;

            output_dir.push(crate::COOKIES_FILE_CSV);

            utils::write_cookies(output_dir, cookies, sep, format)
                .await
                .context(error::TokioTaskSnafu)??;
        }

        Ok(())
    }
}