Skip to main content

rscheck_semantic/
lib.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4#[serde(rename_all = "snake_case")]
5pub enum SemanticBackendAvailability {
6    Available,
7    Unavailable,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub struct SemanticBackendStatus {
12    pub availability: SemanticBackendAvailability,
13    pub runtime: String,
14    pub reason: Option<String>,
15}
16
17impl SemanticBackendStatus {
18    #[must_use]
19    pub fn available(runtime: &str) -> Self {
20        Self {
21            availability: SemanticBackendAvailability::Available,
22            runtime: runtime.to_string(),
23            reason: None,
24        }
25    }
26
27    #[must_use]
28    pub fn unavailable(runtime: &str, reason: impl Into<String>) -> Self {
29        Self {
30            availability: SemanticBackendAvailability::Unavailable,
31            runtime: runtime.to_string(),
32            reason: Some(reason.into()),
33        }
34    }
35
36    #[must_use]
37    pub fn probe() -> Self {
38        Self::probe_for_runtime("current")
39    }
40
41    #[must_use]
42    pub fn probe_for_runtime(runtime: &str) -> Self {
43        #[cfg(feature = "nightly")]
44        {
45            Self {
46                availability: SemanticBackendAvailability::Available,
47                runtime: runtime.to_string(),
48                reason: None,
49            }
50        }
51
52        #[cfg(not(feature = "nightly"))]
53        {
54            Self {
55                availability: SemanticBackendAvailability::Unavailable,
56                runtime: runtime.to_string(),
57                reason: Some(format!(
58                    "semantic backend unavailable on `{runtime}` because rscheck-semantic was built without the `nightly` feature"
59                )),
60            }
61        }
62    }
63
64    #[must_use]
65    pub fn is_available(&self) -> bool {
66        self.availability == SemanticBackendAvailability::Available
67    }
68}