use crate::application::services::interpolation_service::InterpolationService;
use crate::domain::action::BookmarkAction;
use crate::domain::bookmark::Bookmark;
use crate::domain::error::DomainResult;
use crate::domain::services::clipboard::ClipboardService;
use crate::util::interpolation::InterpolationHelper;
use std::sync::Arc;
use tracing::instrument;
#[derive(Debug)]
pub struct SnippetAction {
clipboard_service: Arc<dyn ClipboardService>,
interpolation_service: Arc<dyn InterpolationService>,
}
impl SnippetAction {
pub fn new(
clipboard_service: Arc<dyn ClipboardService>,
interpolation_service: Arc<dyn InterpolationService>,
) -> Self {
Self {
clipboard_service,
interpolation_service,
}
}
}
impl BookmarkAction for SnippetAction {
#[instrument(skip(self, bookmark), level = "debug",
fields(bookmark_id = ?bookmark.id, bookmark_title = %bookmark.title))]
fn execute(&self, bookmark: &Bookmark) -> DomainResult<()> {
let content = bookmark.snippet_content();
let rendered_content = InterpolationHelper::render_if_needed(
content,
bookmark,
&self.interpolation_service,
"snippet",
)?;
eprintln!("Copied to clipboard:\n{}", rendered_content);
self.clipboard_service
.copy_to_clipboard(&rendered_content)?;
Ok(())
}
fn description(&self) -> &'static str {
"Copy to clipboard"
}
}