// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use {
    crate::parse::{MAX_PACKAGE_PATH_SEGMENT_BYTES, MAX_RESOURCE_PATH_SEGMENT_BYTES},
    thiserror::Error,
};

#[derive(PartialEq, Debug, Error)]
pub enum ParseError {
    #[error("missing scheme")]
    MissingScheme,

    #[error("invalid scheme")]
    InvalidScheme,

    #[error("cannot have a scheme")]
    CannotContainScheme,

    #[error("invalid host")]
    InvalidHost,

    #[error("empty host")]
    EmptyHost,

    #[error("missing host")]
    MissingHost,

    #[error("host must be empty to imply absolute path")]
    HostMustBeEmpty,

    #[error("invalid path segment")]
    InvalidPathSegment(#[source] PackagePathSegmentError),

    #[error("invalid name")]
    InvalidName(#[source] PackagePathSegmentError),

    #[error("URL path must start with '/'")]
    PathMustHaveLeadingSlash,

    #[error("missing name")]
    MissingName,

    #[error("invalid variant")]
    InvalidVariant(#[source] PackagePathSegmentError),

    #[error("missing hash")]
    MissingHash,

    #[error("missing resource")]
    MissingResource,

    #[error("invalid hash")]
    InvalidHash(#[source] fuchsia_hash::ParseHashError),

    #[error("uppercase hex characters in hash")]
    UpperCaseHash,

    #[error("multiple hash query parameters")]
    MultipleHashes,

    #[error("cannot contain hash")]
    CannotContainHash,

    #[error("path must be root")]
    PathMustBeRoot,

    #[error("resource path failed to percent decode")]
    ResourcePathPercentDecode(#[source] std::str::Utf8Error),

    #[error("invalid resource path")]
    InvalidResourcePath(#[source] ResourcePathError),

    #[error("cannot contain a resource path (a URL fragment)")]
    CannotContainResource,

    #[error("extra path segments")]
    ExtraPathSegments,

    #[error("extra query parameters")]
    ExtraQueryParameters,

    #[error("cannot contain port")]
    CannotContainPort,

    #[error("cannot contain username")]
    CannotContainUsername,

    #[error("cannot contain password")]
    CannotContainPassword,

    #[error("cannot contain query parameters")]
    CannotContainQueryParameters,

    #[error("relative path URL cannot specify a package hash")]
    RelativePathCannotSpecifyHash,

    #[error("relative path URL cannot specify a variant")]
    RelativePathCannotSpecifyVariant,

    #[error("relative URL could not be parsed into a relative package path, Some({0:?}) != {1:?}")]
    InvalidRelativePath(String, Option<String>),

    #[error(
        "relative URL with absolute path is not supported (relative path cannot start with `/`)"
    )]
    AbsolutePathNotSupported,

    #[error("invalid repository URI")]
    InvalidRepository,

    #[error("url parse error")]
    UrlParseError(#[from] url::ParseError),
}

#[derive(PartialEq, Eq, Debug, Error)]
pub enum PackagePathSegmentError {
    #[error("empty segment")]
    Empty,

    #[error(
        "segment too long. should be at most {} bytes, was {0} bytes",
        MAX_PACKAGE_PATH_SEGMENT_BYTES
    )]
    TooLong(usize),

    #[error("package path segments must consist of only digits (0 to 9), lower-case letters (a to z), hyphen (-), underscore (_), and period (.). this contained {character:?}")]
    InvalidCharacter { character: char },

    #[error("package path segments cannot be a single period")]
    DotSegment,

    #[error("package path segments cannot be two periods")]
    DotDotSegment,
}

#[derive(Clone, Debug, PartialEq, Eq, Error)]
pub enum ResourcePathError {
    #[error("object names must be at least 1 byte")]
    NameEmpty,

    #[error("object names must be at most {} bytes", MAX_RESOURCE_PATH_SEGMENT_BYTES)]
    NameTooLong,

    #[error("object names cannot contain the NULL byte")]
    NameContainsNull,

    #[error("object names cannot be '.'")]
    NameIsDot,

    #[error("object names cannot be '..'")]
    NameIsDotDot,

    #[error("object paths cannot start with '/'")]
    PathStartsWithSlash,

    #[error("object paths cannot end with '/'")]
    PathEndsWithSlash,

    #[error("object paths must be at least 1 byte")]
    PathIsEmpty,

    // TODO(https://fxbug.dev/42096516) allow newline once meta/contents supports it in blob paths
    #[error(r"object names cannot contain the newline character '\n'")]
    NameContainsNewline,
}
