use std::path::Path;
use async_trait::async_trait;
use crate::Result;
use crate::types::{ConversionOptions, ConversionResult, FileFormat, OutputFormat};
#[async_trait]
pub trait DocumentConverter: Send + Sync {
fn supported_formats(&self) -> Vec<FileFormat>;
fn output_formats(&self) -> Vec<OutputFormat>;
fn can_convert(&self, format: FileFormat) -> bool {
self.supported_formats().contains(&format)
}
async fn convert(
&self,
input: &Path,
output_format: OutputFormat,
options: ConversionOptions,
) -> Result<ConversionResult>;
fn metadata(&self) -> ConverterMetadata;
}
#[derive(Debug, Clone)]
pub struct ConverterMetadata {
pub name: String,
pub version: String,
pub description: String,
pub external_deps: Vec<String>,
}
impl Default for ConverterMetadata {
fn default() -> Self {
Self {
name: "Unknown".to_string(),
version: "0.0.0".to_string(),
description: String::new(),
external_deps: Vec::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_converter_metadata_default() {
let meta = ConverterMetadata::default();
assert_eq!(meta.name, "Unknown");
assert!(meta.external_deps.is_empty());
}
}