Documentation
// License: see LICENSE file at root directory of `master` branch

//! # Here's The Thing
//!
//! ## Project
//!
//! - Repository: <https://bitbucket.org/haibison/htt>
//! - License: Nice License 1.0.0 _(see LICENSE file at root directory of `master` branch)_
//! - _This project follows [Semantic Versioning 2.0.0]_
//!
//! ## Features
//!
//! _Here's The Thing_ is a simple HTTP project.
//!
//! ## Notes
//!
//! The crate uses `#![no_std]` by default. Documentation is built with all features, which include `std`. If you see some components from
//! [`std`][crate:std] crate, you have to use that feature.
//!
//! [Semantic Versioning 2.0.0]: https://semver.org/spec/v2.0.0.html
//!
//! [crate:std]: https://doc.rust-lang.org/std/

#![warn(missing_docs)]
#![no_std]
#![forbid(unsafe_code)]

// ╔═════════════════╗
// ║   IDENTIFIERS   ║
// ╚═════════════════╝

macro_rules! code_name  { () => { "htt" }}
macro_rules! version    { () => { "0.4.1" }}

/// # Crate name
pub const NAME: &str = "htt";

/// # Crate code name
pub const CODE_NAME: &str = code_name!();

/// # ID of this crate
pub const ID: &str = concat!(
    "96aef56b-d6829393-c69698d6-9e73a6de-2912ef52-2291c6bf-cf37c8cc-f4942f65-",
    "4686e0e4-66346d2b-d683f825-64a009ff-5751f2cd-14264647-3a157217-bef271e4",
);

/// # Crate version
pub const VERSION: &str = version!();

/// # Crate release date (year/month/day)
pub const RELEASE_DATE: (u16, u8, u8) = (2020, 4, 9);

/// # Tag, which can be used for logging...
pub const TAG: &str = concat!(code_name!(), "::96aef56b::", version!());

// ╔════════════════════╗
// ║   IMPLEMENTATION   ║
// ╚════════════════════╝

#[macro_use]
extern crate alloc;

#[cfg(feature="std")]
extern crate std;

/// # Makes new Error, prefixing your message with: ::TAG, module_path!(), line!()
macro_rules! e { ($($arg: tt)+) => {
    Error::from(format!(
        "[{tag}][{module_path}-{line}] {format}", tag=crate::TAG, module_path=module_path!(), line=line!(), format=format!($($arg)+),
    ))
};}

/// # Wrapper for format!(), which prefixes your message with: ::TAG, module_path!(), line!()
#[cfg(feature="std")]
macro_rules! __ { ($($arg: tt)+) => {
    format!("[{}][{}-{}] {}", crate::TAG, module_path!(), line!(), format!($($arg)+))
};}

mod error;
mod header;
mod io;
mod method;
mod request;
mod response;
mod status;
mod version;

pub mod version_info;

pub use self::{
    error::*,
    header::*,
    method::*,
    request::*,
    response::*,
    status::*,
    version::*,
};

/// # Result type used in this crate
pub type Result<T> = core::result::Result<T, Error>;

/// # Result for I/O functions
#[cfg(feature="std")]
pub type IoResult<T> = core::result::Result<T, std::io::Error>;

#[test]
fn test_crate_version() {
    assert_eq!(VERSION, env!("CARGO_PKG_VERSION"));
}