Ctrl K
ComunidadGuías…

sync/src/lib.rs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
use std::path::Path;
mod db;
mod gitignore;
mod sync;
mod sync_db;
mod utils;

use neon::prelude::*;

fn build_js_array<'a>(
    rs_array: Vec<(String, String)>,
    cx: &mut FunctionContext<'a>,
) -> Handle<'a, JsArray> {
    let js_array = JsArray::new(cx, rs_array.len() as u32);
    for (i, (name, hash)) in rs_array.iter().enumerate() {
        let js_object = JsObject::new(cx);

        let name = JsString::new(cx, &name);
        let _ = js_object.set(cx, "name", name);
        let hash = JsString::new(cx, &hash);
        let _ = js_object.set(cx, "hash", hash);

        let _ = js_array.set(cx, i as u32, js_object);
    }

    return js_array;
}

fn sync_results(mut cx: FunctionContext) -> JsResult<JsArray> {
    let dir = cx.argument::<JsString>(0)?.value(&mut cx);
    let branch = cx.argument::<JsString>(1)?.value(&mut cx);
    let provider_id = cx.argument::<JsString>(2)?.value(&mut cx);

    let tag = sync::Tag {
        dir: Path::new(&dir),
        branch: &branch,
        provider_id: &provider_id.to_string(),
    };

    let compute = sync_db::sync_db(&tag);
    let compute_js_array = build_js_array(compute, &mut cx);

    return Ok(compute_js_array);
}

fn db_add_chunk(mut cx: FunctionContext) -> JsResult<JsUndefined> {
    let chunk_obj = cx.argument::<JsObject>(0)?;

    let hash = chunk_obj
        .get::<JsString, _, _>(&mut cx, "digest")?
        .value(&mut cx);

    let content = chunk_obj
        .get::<JsString, _, _>(&mut cx, "content")?
        .value(&mut cx);

    let start_line = chunk_obj
        .get::<JsNumber, _, _>(&mut cx, "startLine")?
        .value(&mut cx) as usize;

    let end_line = chunk_obj
        .get::<JsNumber, _, _>(&mut cx, "endLine")?
        .value(&mut cx) as usize;

    let file_path = chunk_obj
        .get::<JsString, _, _>(&mut cx, "filepath")?
        .value(&mut cx);

    let index = chunk_obj
        .get::<JsNumber, _, _>(&mut cx, "index")?
        .value(&mut cx) as usize;

    let tags_vec = cx.argument::<JsArray>(1)?.to_vec(&mut cx).unwrap();
    let mut tags: Vec<String> = Vec::new();
    for item in tags_vec {
        let tag = item
            .downcast::<JsString, _>(&mut cx)
            .unwrap()
            .value(&mut cx);
        tags.push(tag);
    }

    let embedding_vec = cx.argument::<JsArray>(2)?.to_vec(&mut cx).unwrap();
    let mut embedding: Vec<f32> = Vec::new();
    for item in embedding_vec {
        let float = item
            .downcast::<JsNumber, _>(&mut cx)
            .unwrap()
            .value(&mut cx) as f32;
        embedding.push(float);
    }

    let chunk = db::Chunk {
        hash,
        content,
        start_line,
        end_line,
        file_path,
        index,
        embedding,
    };

    db::add_chunk(chunk, tags);

    return Ok(JsUndefined::new(&mut cx));
}

fn db_retrieve(mut cx: FunctionContext) -> JsResult<JsArray> {
    let n = cx.argument::<JsNumber>(0)?.value(&mut cx) as usize;

    let tags_vec = cx.argument::<JsArray>(1)?.to_vec(&mut cx).unwrap();
    let mut tags: Vec<String> = Vec::new();
    for item in tags_vec {
        let tag = item
            .downcast::<JsString, _>(&mut cx)
            .unwrap()
            .value(&mut cx);
        tags.push(tag);
    }

    let v_vec = cx.argument::<JsArray>(2)?.to_vec(&mut cx).unwrap();
    let mut v: Vec<f32> = Vec::new();
    for item in v_vec {
        let float = item
            .downcast::<JsNumber, _>(&mut cx)
            .unwrap()
            .value(&mut cx) as f32;
        v.push(float);
    }

    let results = db::retrieve(n, tags, v);

    let js_array = JsArray::new(&mut cx, results.len() as u32);
    for (i, chunk) in results.iter().enumerate() {
        let js_object = JsObject::new(&mut cx);

        let hash = JsString::new(&mut cx, &chunk.hash);
        let _ = js_object.set(&mut cx, "hash", hash);

        let content = JsString::new(&mut cx, &chunk.content);
        let _ = js_object.set(&mut cx, "content", content);

        let start_line = JsNumber::new(&mut cx, chunk.start_line as f64);
        let _ = js_object.set(&mut cx, "startLine", start_line);

        let end_line = JsNumber::new(&mut cx, chunk.end_line as f64);
        let _ = js_object.set(&mut cx, "endLine", end_line);

        let file_path = JsString::new(&mut cx, &chunk.file_path);
        let _ = js_object.set(&mut cx, "filepath", file_path);

        let index = JsNumber::new(&mut cx, chunk.index as f64);
        let _ = js_object.set(&mut cx, "index", index);

        let _ = js_array.set(&mut cx, i as u32, js_object);
    }

    return Ok(js_array);
}

#[neon::main]
fn main(mut cx: ModuleContext) -> NeonResult<()> {
    let _ = cx.export_function("sync_results", sync_results)?;
    let _ = cx.export_function("add_chunk", db_add_chunk);
    let _ = cx.export_function("retrieve", db_retrieve);
    Ok(())
}