diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2019-06-13 01:55:59 +0200 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-06-12 16:55:59 -0700 |
commit | bca5cc5041172e22ad1851c8510d6521bf70ec22 (patch) | |
tree | a772e0619cb6007c603fd1821b130269b3cfeb75 /cli/module_specifier.rs | |
parent | b3c4307d02d627287cd28486b208b53c3bd378f0 (diff) |
Move ModuleSpecifier to //core (#2509)
Diffstat (limited to 'cli/module_specifier.rs')
-rw-r--r-- | cli/module_specifier.rs | 81 |
1 files changed, 0 insertions, 81 deletions
diff --git a/cli/module_specifier.rs b/cli/module_specifier.rs deleted file mode 100644 index 475211289..000000000 --- a/cli/module_specifier.rs +++ /dev/null @@ -1,81 +0,0 @@ -use std::fmt; -use url::Url; - -#[derive(Debug, Clone, PartialEq)] -/// Resolved module specifier -pub struct ModuleSpecifier(Url); - -impl ModuleSpecifier { - pub fn to_url(&self) -> Url { - self.0.clone() - } - /// Resolves module using this algorithm: - /// https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-module-specifier - pub fn resolve( - specifier: &str, - base: &str, - ) -> Result<ModuleSpecifier, url::ParseError> { - // 1. Apply the URL parser to specifier. If the result is not failure, return - // the result. - // let specifier = parse_local_or_remote(specifier)?.to_string(); - if let Ok(url) = Url::parse(specifier) { - return Ok(ModuleSpecifier(url)); - } - - // 2. If specifier does not start with the character U+002F SOLIDUS (/), the - // two-character sequence U+002E FULL STOP, U+002F SOLIDUS (./), or the - // three-character sequence U+002E FULL STOP, U+002E FULL STOP, U+002F - // SOLIDUS (../), return failure. - if !specifier.starts_with('/') - && !specifier.starts_with("./") - && !specifier.starts_with("../") - { - // TODO This is (probably) not the correct error to return here. - // TODO: This error is very not-user-friendly - return Err(url::ParseError::RelativeUrlWithCannotBeABaseBase); - } - - // 3. Return the result of applying the URL parser to specifier with base URL - // as the base URL. - let base_url = Url::parse(base)?; - let u = base_url.join(&specifier)?; - Ok(ModuleSpecifier(u)) - } - - /// Takes a string representing a path or URL to a module, but of the type - /// passed through the command-line interface for the main module. This is - /// slightly different than specifiers used in import statements: "foo.js" for - /// example is allowed here, whereas in import statements a leading "./" is - /// required ("./foo.js"). This function is aware of the current working - /// directory and returns an absolute URL. - pub fn resolve_root( - root_specifier: &str, - ) -> Result<ModuleSpecifier, url::ParseError> { - if let Ok(url) = Url::parse(root_specifier) { - Ok(ModuleSpecifier(url)) - } else { - let cwd = std::env::current_dir().unwrap(); - let base = Url::from_directory_path(cwd).unwrap(); - let url = base.join(root_specifier)?; - Ok(ModuleSpecifier(url)) - } - } -} - -impl From<Url> for ModuleSpecifier { - fn from(url: Url) -> Self { - ModuleSpecifier(url) - } -} - -impl fmt::Display for ModuleSpecifier { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.0.fmt(f) - } -} - -impl PartialEq<String> for ModuleSpecifier { - fn eq(&self, other: &String) -> bool { - &self.to_string() == other - } -} |