1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
// 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.1.0" }}

/// # 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) = (2019, 11, 26);

/// # 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"));
}