#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum PositionEncoding {
Utf8,
#[default]
Utf16,
}
impl PositionEncoding {
pub fn from_capabilities(capabilities: &serde_json::Value) -> Self {
match capabilities
.get("positionEncoding")
.and_then(|v| v.as_str())
{
Some("utf-8") => Self::Utf8,
_ => Self::Utf16,
}
}
}
#[cfg(test)]
mod tests {
use super::PositionEncoding;
use serde_json::json;
#[test]
fn missing_field_defaults_to_utf16() {
assert_eq!(
PositionEncoding::from_capabilities(&json!({})),
PositionEncoding::Utf16
);
}
#[test]
fn explicit_utf8() {
assert_eq!(
PositionEncoding::from_capabilities(&json!({ "positionEncoding": "utf-8" })),
PositionEncoding::Utf8
);
}
#[test]
fn explicit_utf16() {
assert_eq!(
PositionEncoding::from_capabilities(&json!({ "positionEncoding": "utf-16" })),
PositionEncoding::Utf16
);
}
#[test]
fn unknown_value_defaults_to_utf16() {
assert_eq!(
PositionEncoding::from_capabilities(&json!({ "positionEncoding": "utf-32" })),
PositionEncoding::Utf16
);
}
#[test]
fn null_capabilities_defaults_to_utf16() {
assert_eq!(
PositionEncoding::from_capabilities(&serde_json::Value::Null),
PositionEncoding::Utf16
);
}
}