storage-kit 0.0.1

Portable database and transactional state-store Kit.
Documentation
use crate::{DataRecord, QueryResponse, RecordsPage, ScoreKind, ScoredRecord};

pub(super) fn records_page_to_query_response(
    mut page: RecordsPage,
    score_kind: ScoreKind,
) -> QueryResponse {
    let hits = page
        .records
        .drain(..)
        .map(|mut record| {
            let raw_score = extract_score(&mut record);
            ScoredRecord {
                record,
                raw_score,
                score_kind: score_kind.clone(),
            }
        })
        .collect();

    QueryResponse::from_hits(hits, page.next_page)
}

fn extract_score(record: &mut DataRecord) -> Option<f64> {
    for key in ["_distance", "_score"] {
        if let Some(value) = record.fields.remove(key) {
            if let Some(score) = value.as_f64() {
                return Some(score);
            }
            if let Some(score) = value.as_i64() {
                return Some(score as f64);
            }
            if let Some(score) = value.as_u64() {
                return Some(score as f64);
            }
        }
    }
    None
}