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}