diff options
author | Norbert Preining <norbert@preining.info> | 2019-12-03 03:01:24 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-12-03 03:01:24 +0000 |
commit | b8d4bb76703bcb15578e2b23c5d256532180b894 (patch) | |
tree | bedd1df7a00521a2bd986b3c0289d6556a59e39b /support/texlab/src/workspace/uri.rs | |
parent | 02e4625a78a5029e8b5dc2a4ec70193b232f497e (diff) |
CTAN sync 201912030301
Diffstat (limited to 'support/texlab/src/workspace/uri.rs')
-rw-r--r-- | support/texlab/src/workspace/uri.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/support/texlab/src/workspace/uri.rs b/support/texlab/src/workspace/uri.rs new file mode 100644 index 0000000000..7fc24d238f --- /dev/null +++ b/support/texlab/src/workspace/uri.rs @@ -0,0 +1,73 @@ +use lsp_types::*; +use serde::{Deserialize, Serialize}; +use std::fmt; +use std::hash::{Hash, Hasher}; +use std::ops::Deref; +use std::path::Path; + +#[derive(Debug, Eq, Clone, Serialize, Deserialize)] +pub struct Uri(Url); + +impl Uri { + pub fn from_file_path<P: AsRef<Path>>(path: P) -> Result<Self, ()> { + Url::from_file_path(path).map(|url| url.into()) + } +} + +impl PartialEq for Uri { + fn eq(&self, other: &Self) -> bool { + if cfg!(windows) { + self.as_str().to_lowercase() == other.as_str().to_lowercase() + } else { + self.as_str() == other.as_str() + } + } +} + +impl Hash for Uri { + fn hash<H: Hasher>(&self, state: &mut H) { + self.as_str().to_lowercase().hash(state); + } +} + +impl Deref for Uri { + type Target = Url; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From<Url> for Uri { + fn from(url: Url) -> Self { + Uri(url) + } +} + +impl Into<Url> for Uri { + fn into(self) -> Url { + self.0 + } +} + +impl fmt::Display for Uri { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} + +pub trait AsUri { + fn as_uri(&self) -> Uri; +} + +impl AsUri for TextDocumentIdentifier { + fn as_uri(&self) -> Uri { + self.uri.clone().into() + } +} + +impl AsUri for TextDocumentPositionParams { + fn as_uri(&self) -> Uri { + self.text_document.as_uri() + } +} |