// 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 std::error;
use std::fmt;

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ParseError {
    InvalidScheme,
    InvalidHost,
    InvalidName,
    InvalidVariant,
    InvalidHash,
    InvalidResourcePath,
    ExtraPathSegments,
    CannotContainPort,
    CannotContainUsername,
    CannotContainPassword,
    CannotContainQueryParameters,
    UrlParseError(url::ParseError),
}

impl fmt::Display for ParseError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            ParseError::InvalidScheme => write!(f, "invalid scheme"),
            ParseError::InvalidHost => write!(f, "invalid host"),
            ParseError::InvalidName => write!(f, "invalid name"),
            ParseError::InvalidVariant => write!(f, "invalid variant"),
            ParseError::InvalidHash => write!(f, "invalid hash"),
            ParseError::InvalidResourcePath => write!(f, "invalid resource path"),
            ParseError::ExtraPathSegments => write!(f, "extra path segments"),
            ParseError::CannotContainPort => write!(f, "cannot contain port"),
            ParseError::CannotContainUsername => write!(f, "cannot contain username"),
            ParseError::CannotContainPassword => write!(f, "cannot contain password"),
            ParseError::CannotContainQueryParameters => write!(f, "cannot contain query parameters"),
            ParseError::UrlParseError(err) => err.fmt(f),
        }
    }
}

impl error::Error for ParseError {
    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
        match *self {
            ParseError::InvalidScheme => None,
            ParseError::InvalidHost => None,
            ParseError::InvalidName => None,
            ParseError::InvalidVariant => None,
            ParseError::InvalidHash => None,
            ParseError::InvalidResourcePath => None,
            ParseError::ExtraPathSegments => None,
            ParseError::CannotContainPort => None,
            ParseError::CannotContainUsername => None,
            ParseError::CannotContainPassword => None,
            ParseError::CannotContainQueryParameters => None,
            ParseError::UrlParseError(ref err) => err.source(),
        }
    }
}

impl From<url::ParseError> for ParseError {
    fn from(err: url::ParseError) -> Self {
        ParseError::UrlParseError(err)
    }
}
