synaptic-loaders 0.4.0

Document loaders: Text, JSON, CSV, Markdown, Directory, Web, Notion, GitHub, YouTube, arXiv
Documentation
use std::fs;
use std::sync::atomic::{AtomicUsize, Ordering};

use synaptic_loaders::{Loader, MarkdownLoader};

static COUNTER: AtomicUsize = AtomicUsize::new(0);

fn tempfile(content: &str) -> std::path::PathBuf {
    let n = COUNTER.fetch_add(1, Ordering::SeqCst);
    let path = std::env::temp_dir().join(format!(
        "synapse-md-loader-test-{}-{}.md",
        std::process::id(),
        n
    ));
    fs::write(&path, content).unwrap();
    path
}

#[tokio::test]
async fn loads_markdown_content() {
    let md = "# Title\n\nSome **bold** text.\n\n## Section\n\nMore content.";
    let path = tempfile(md);
    let loader = MarkdownLoader::new(&path);
    let docs = loader.load().await.unwrap();

    assert_eq!(docs.len(), 1);
    assert_eq!(docs[0].content, md);
}

#[tokio::test]
async fn adds_format_and_source_metadata() {
    let path = tempfile("# Hello");
    let loader = MarkdownLoader::new(&path);
    let docs = loader.load().await.unwrap();

    assert_eq!(
        docs[0].metadata.get("format").unwrap(),
        &serde_json::Value::String("markdown".to_string())
    );
    assert_eq!(
        docs[0].metadata.get("source").unwrap(),
        &serde_json::Value::String(path.to_string_lossy().to_string())
    );
}

#[tokio::test]
async fn returns_error_for_missing_file() {
    let loader = MarkdownLoader::new("/tmp/nonexistent-synapse-md-test-12345.md");
    let result = loader.load().await;
    assert!(result.is_err());
}