@ -1,15 +1,18 @@
use std ::{
fmt ,
path ::{ Path , PathBuf } ,
sync ::Arc ,
} ;
/// A generic pointer to a file location.
///
/// Currently this type only supports paths to local files.
///
/// Cloning this type is cheap: the internal representation uses an Arc.
#[ derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord) ]
#[ non_exhaustive ]
pub enum Uri {
File ( PathBuf ) ,
File ( Arc< Path > ) ,
}
impl Uri {
@ -26,27 +29,11 @@ impl Uri {
Self ::File ( path ) = > Some ( path ) ,
}
}
pub fn as_path_buf ( self ) -> Option < PathBuf > {
match self {
Self ::File ( path ) = > Some ( path ) ,
}
}
}
impl From < PathBuf > for Uri {
fn from ( path : PathBuf ) -> Self {
Self ::File ( path )
}
}
impl TryFrom < Uri > for PathBuf {
type Error = ( ) ;
fn try_from ( uri : Uri ) -> Result < Self , Self ::Error > {
match uri {
Uri ::File ( path ) = > Ok ( path ) ,
}
Self ::File ( path . into ( ) )
}
}
@ -93,7 +80,7 @@ impl std::error::Error for UrlConversionError {}
fn convert_url_to_uri ( url : & url ::Url ) -> Result < Uri , UrlConversionErrorKind > {
if url . scheme ( ) = = "file" {
url . to_file_path ( )
. map ( | path | Uri ::File ( helix_stdx ::path ::normalize ( path ) ))
. map ( | path | Uri ::File ( helix_stdx ::path ::normalize ( path ) .into ( ) ))
. map_err ( | _ | UrlConversionErrorKind ::UnableToConvert )
} else {
Err ( UrlConversionErrorKind ::UnsupportedScheme )