amagi 0.1.3

Rust SDK, CLI, and Web API service skeleton for multi-platform social web adapters.
Documentation
use tracing::info;

use super::resolve::resolve_user_reference;
use crate::APP_NAME;
use crate::client::AmagiClient;
use crate::config::TwitterRunTask;
use crate::error::AppError;
use crate::output::Printer;

pub(super) async fn run_task(
    printer: &Printer,
    client: &AmagiClient,
    task: &TwitterRunTask,
) -> Result<(), AppError> {
    let fetcher = client.twitter_fetcher();

    match task {
        TwitterRunTask::UserProfile { screen_name } => {
            let screen_name = resolve_user_reference(screen_name)?;
            let result = fetcher.fetch_user_profile(&screen_name).await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userProfile",
                screen_name = screen_name.as_str(),
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserTimeline {
            screen_name,
            count,
            cursor,
        } => {
            let screen_name = resolve_user_reference(screen_name)?;
            let result = fetcher
                .fetch_user_timeline(&screen_name, *count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userTimeline",
                screen_name = screen_name.as_str(),
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserReplies {
            screen_name,
            count,
            cursor,
        } => {
            let screen_name = resolve_user_reference(screen_name)?;
            let result = fetcher
                .fetch_user_replies(&screen_name, *count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userReplies",
                screen_name = screen_name.as_str(),
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserMedia {
            screen_name,
            count,
            cursor,
        } => {
            let screen_name = resolve_user_reference(screen_name)?;
            let result = fetcher
                .fetch_user_media(&screen_name, *count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userMedia",
                screen_name = screen_name.as_str(),
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserFollowers {
            screen_name,
            count,
            cursor,
        } => {
            let screen_name = resolve_user_reference(screen_name)?;
            let result = fetcher
                .fetch_user_followers(&screen_name, *count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userFollowers",
                screen_name = screen_name.as_str(),
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserFollowing {
            screen_name,
            count,
            cursor,
        } => {
            let screen_name = resolve_user_reference(screen_name)?;
            let result = fetcher
                .fetch_user_following(&screen_name, *count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userFollowing",
                screen_name = screen_name.as_str(),
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserLikes { count, cursor } => {
            let result = fetcher.fetch_user_likes(*count, cursor.as_deref()).await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userLikes",
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserBookmarks { count, cursor } => {
            let result = fetcher
                .fetch_user_bookmarks(*count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userBookmarks",
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserFollowed { count, cursor } => {
            let result = fetcher
                .fetch_user_followed(*count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userFollowed",
                "cli fetch completed"
            );
        }
        TwitterRunTask::UserRecommended { count, cursor } => {
            let result = fetcher
                .fetch_user_recommended(*count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "userRecommended",
                "cli fetch completed"
            );
        }
        TwitterRunTask::SearchUsers {
            query,
            count,
            cursor,
        } => {
            let result = fetcher
                .search_users(query, *count, cursor.as_deref())
                .await?;
            printer.print_payload(&result)?;
            info!(
                app = APP_NAME,
                mode = "cli",
                platform = "twitter",
                method = "searchUsers",
                query = query.as_str(),
                "cli fetch completed"
            );
        }
        _ => unreachable!("unsupported twitter user task"),
    }

    Ok(())
}