diskann_tools/utils/
cmd_tool_error.rs

1/*
2 * Copyright (c) Microsoft Corporation.
3 * Licensed under the MIT license.
4 */
5
6use std::{error::Error, fmt};
7
8/// Error that wraps all errors generated by command-line tools
9#[derive(PartialEq)]
10pub struct CMDToolError {
11    pub details: String,
12}
13
14impl fmt::Display for CMDToolError {
15    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
16        write!(f, "{}", self.details)
17    }
18}
19
20// Implement `Debug` in terms of `Display` so when `CMDToolError` hits the top level, we
21// get proper formatting.
22impl fmt::Debug for CMDToolError {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        <Self as fmt::Display>::fmt(self, f)
25    }
26}
27
28impl Error for CMDToolError {
29    fn description(&self) -> &str {
30        &self.details
31    }
32}
33
34impl From<std::io::Error> for CMDToolError {
35    fn from(err: std::io::Error) -> Self {
36        CMDToolError {
37            details: err.to_string(),
38        }
39    }
40}
41
42impl From<rand_distr::NormalError> for CMDToolError {
43    fn from(err: rand_distr::NormalError) -> Self {
44        CMDToolError {
45            details: err.to_string(),
46        }
47    }
48}
49impl From<diskann::ANNError> for CMDToolError {
50    fn from(err: diskann::ANNError) -> Self {
51        CMDToolError {
52            details: err.to_string(),
53        }
54    }
55}
56impl From<diskann::graph::config::ConfigError> for CMDToolError {
57    fn from(err: diskann::graph::config::ConfigError) -> Self {
58        CMDToolError {
59            details: err.to_string(),
60        }
61    }
62}
63
64impl From<diskann_label_filter::JsonlReadError> for CMDToolError {
65    fn from(err: diskann_label_filter::JsonlReadError) -> Self {
66        CMDToolError {
67            details: err.to_string(),
68        }
69    }
70}
71
72impl<T, U> From<diskann_providers::utils::MetadataError<T, U>> for CMDToolError
73where
74    T: std::error::Error + Send + Sync + 'static,
75    U: std::error::Error + Send + Sync + 'static,
76{
77    fn from(err: diskann_providers::utils::MetadataError<T, U>) -> Self {
78        // Leverage the existing conversion chain: MetadataError -> ANNError -> CMDToolError
79        let ann_error: diskann::ANNError = err.into();
80        ann_error.into()
81    }
82}