Add rustfmt and clippy to CI and address clippy warnings.

This commit is contained in:
Jimmy Cuadra 2019-06-02 19:12:05 -07:00
parent 2e0376a8a4
commit e3b453c468
4 changed files with 67 additions and 24 deletions

View File

@ -1 +0,0 @@
merge_imports = true

View File

@ -1,8 +1,10 @@
language: "rust" language: "rust"
before_script: before_script:
- "rustup component add rustfmt" - "rustup component add rustfmt"
- "rustup component add clippy"
script: script:
- "cargo fmt --all -- --check" - "cargo fmt --all -- --check"
- "cargo clippy --all-targets --all-features -- -D warnings"
- "cargo build --verbose" - "cargo build --verbose"
- "cargo test --verbose" - "cargo test --verbose"
notifications: notifications:

View File

@ -1,2 +0,0 @@
imports_indent = "Block"
imports_layout = "HorizontalVertical"

View File

@ -113,7 +113,31 @@
//! //!
//! Just like the `SignatureSet` itself, the `Signatures` value can also be deserialized from JSON. //! Just like the `SignatureSet` itself, the `Signatures` value can also be deserialized from JSON.
#![deny(missing_docs, warnings)] #![deny(
missing_copy_implementations,
missing_debug_implementations,
missing_docs,
warnings
)]
#![warn(
clippy::empty_line_after_outer_attr,
clippy::expl_impl_clone_on_copy,
clippy::if_not_else,
clippy::items_after_statements,
clippy::match_same_arms,
clippy::mem_forget,
clippy::missing_docs_in_private_items,
clippy::multiple_inherent_impl,
clippy::mut_mut,
clippy::needless_borrow,
clippy::needless_continue,
clippy::single_match_else,
clippy::unicode_not_nfc,
clippy::use_self,
clippy::used_underscore_binding,
clippy::wrong_pub_self_convention,
clippy::wrong_self_convention
)]
use std::{ use std::{
collections::{HashMap, HashSet}, collections::{HashMap, HashSet},
@ -212,12 +236,15 @@ where
/// An error when trying to extract the algorithm and version from a key identifier. /// An error when trying to extract the algorithm and version from a key identifier.
#[derive(Debug)] #[derive(Debug)]
enum SplitError<'a> { enum SplitError<'a> {
/// The signature's ID has an invalid length.
InvalidLength(usize), InvalidLength(usize),
/// The signature uses an unknown algorithm.
UnknownAlgorithm(&'a str), UnknownAlgorithm(&'a str),
} }
/// Extract the algorithm and version from a key identifier. /// Extract the algorithm and version from a key identifier.
fn split_id(id: &str) -> Result<(Algorithm, String), SplitError<'_>> { fn split_id(id: &str) -> Result<(Algorithm, String), SplitError<'_>> {
/// The length of a valid signature ID.
const SIGNATURE_ID_LENGTH: usize = 2; const SIGNATURE_ID_LENGTH: usize = 2;
let signature_id: Vec<&str> = id.split(':').collect(); let signature_id: Vec<&str> = id.split(':').collect();
@ -246,18 +273,22 @@ pub enum Algorithm {
} }
/// An Ed25519 key pair. /// An Ed25519 key pair.
#[derive(Debug)]
pub struct Ed25519KeyPair { pub struct Ed25519KeyPair {
/// The *ring* key pair.
ring_key_pair: RingEd25519KeyPair, ring_key_pair: RingEd25519KeyPair,
/// The version of the key pair.
version: String, version: String,
} }
/// A verifier for Ed25519 digital signatures. /// A verifier for Ed25519 digital signatures.
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug, Default)]
pub struct Ed25519Verifier; pub struct Ed25519Verifier;
/// An error produced when ruma_signatures operations fail. /// An error produced when `ruma_signatures` operations fail.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Error { pub struct Error {
/// A human-readable description of the error.
message: String, message: String,
} }
@ -290,14 +321,18 @@ pub trait KeyPair: Sized {
/// A digital signature. /// A digital signature.
#[derive(Clone, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct Signature { pub struct Signature {
/// The cryptographic algorithm to use.
algorithm: Algorithm, algorithm: Algorithm,
/// The signature data.
signature: Vec<u8>, signature: Vec<u8>,
/// The version of the signature.
version: String, version: String,
} }
/// A map of server names to sets of digital signatures created by that server. /// A map of server names to sets of digital signatures created by that server.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Default)]
pub struct Signatures { pub struct Signatures {
/// A map of homeservers to sets of signatures for the homeserver.
map: HashMap<Host, SignatureSet>, map: HashMap<Host, SignatureSet>,
} }
@ -305,8 +340,9 @@ pub struct Signatures {
struct SignaturesVisitor; struct SignaturesVisitor;
/// A set of digital signatures created by a single homeserver. /// A set of digital signatures created by a single homeserver.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Default)]
pub struct SignatureSet { pub struct SignatureSet {
/// A set of signatures for a homeserver.
set: HashSet<Signature>, set: HashSet<Signature>,
} }
@ -336,13 +372,13 @@ pub trait Verifier {
impl KeyPair for Ed25519KeyPair { impl KeyPair for Ed25519KeyPair {
fn new(public_key: &[u8], private_key: &[u8], version: String) -> Result<Self, Error> { fn new(public_key: &[u8], private_key: &[u8], version: String) -> Result<Self, Error> {
Ok(Ed25519KeyPair { Ok(Self {
ring_key_pair: RingEd25519KeyPair::from_seed_and_public_key( ring_key_pair: RingEd25519KeyPair::from_seed_and_public_key(
Input::from(private_key), Input::from(private_key),
Input::from(public_key), Input::from(public_key),
) )
.map_err(|_| Error::new("invalid key pair"))?, .map_err(|_| Error::new("invalid key pair"))?,
version: version, version,
}) })
} }
@ -389,7 +425,7 @@ impl Error {
where where
T: Into<String>, T: Into<String>,
{ {
Error { Self {
message: message.into(), message: message.into(),
} }
} }
@ -426,10 +462,10 @@ impl Signature {
} }
})?; })?;
Ok(Signature { Ok(Self {
algorithm: algorithm, algorithm,
signature: bytes.to_vec(), signature: bytes.to_vec(),
version: version, version,
}) })
} }
@ -466,7 +502,7 @@ impl Signature {
impl Signatures { impl Signatures {
/// Initializes a new empty Signatures. /// Initializes a new empty Signatures.
pub fn new() -> Self { pub fn new() -> Self {
Signatures { Self {
map: HashMap::new(), map: HashMap::new(),
} }
} }
@ -477,7 +513,7 @@ impl Signatures {
/// ///
/// * capacity: The number of items to allocate memory for. /// * capacity: The number of items to allocate memory for.
pub fn with_capacity(capacity: usize) -> Self { pub fn with_capacity(capacity: usize) -> Self {
Signatures { Self {
map: HashMap::with_capacity(capacity), map: HashMap::with_capacity(capacity),
} }
} }
@ -516,6 +552,11 @@ impl Signatures {
pub fn len(&self) -> usize { pub fn len(&self) -> usize {
self.map.len() self.map.len()
} }
/// Whether or not the collection of signatures is empty.
pub fn is_empty(&self) -> bool {
self.len() == 0
}
} }
impl<'de> Deserialize<'de> for Signatures { impl<'de> Deserialize<'de> for Signatures {
@ -562,7 +603,7 @@ impl<'de> Visitor<'de> for SignaturesVisitor {
while let Some((server_name, signature_set)) = while let Some((server_name, signature_set)) =
visitor.next_entry::<String, SignatureSet>()? visitor.next_entry::<String, SignatureSet>()?
{ {
if let Err(_) = signatures.insert(&server_name, signature_set) { if signatures.insert(&server_name, signature_set).is_err() {
return Err(M::Error::invalid_value( return Err(M::Error::invalid_value(
Unexpected::Str(&server_name), Unexpected::Str(&server_name),
&self, &self,
@ -577,7 +618,7 @@ impl<'de> Visitor<'de> for SignaturesVisitor {
impl SignatureSet { impl SignatureSet {
/// Initializes a new empty SignatureSet. /// Initializes a new empty SignatureSet.
pub fn new() -> Self { pub fn new() -> Self {
SignatureSet { Self {
set: HashSet::new(), set: HashSet::new(),
} }
} }
@ -588,7 +629,7 @@ impl SignatureSet {
/// ///
/// * capacity: The number of items to allocate memory for. /// * capacity: The number of items to allocate memory for.
pub fn with_capacity(capacity: usize) -> Self { pub fn with_capacity(capacity: usize) -> Self {
SignatureSet { Self {
set: HashSet::with_capacity(capacity), set: HashSet::with_capacity(capacity),
} }
} }
@ -609,6 +650,11 @@ impl SignatureSet {
pub fn len(&self) -> usize { pub fn len(&self) -> usize {
self.set.len() self.set.len()
} }
/// Whether or not the set of signatures is empty.
pub fn is_empty(&self) -> bool {
self.len() == 0
}
} }
impl<'de> Deserialize<'de> for SignatureSet { impl<'de> Deserialize<'de> for SignatureSet {
@ -666,9 +712,9 @@ impl<'de> Visitor<'de> for SignatureSetVisitor {
}; };
let signature = Signature { let signature = Signature {
algorithm: algorithm, algorithm,
signature: signature_bytes, signature: signature_bytes,
version: version, version,
}; };
signature_set.insert(signature); signature_set.insert(signature);
@ -773,9 +819,7 @@ mod test {
let mut signatures = Signatures::with_capacity(1); let mut signatures = Signatures::with_capacity(1);
signatures.insert("domain", signature_set).ok(); signatures.insert("domain", signature_set).ok();
let empty = EmptyWithSignatures { let empty = EmptyWithSignatures { signatures };
signatures: signatures,
};
let json = to_string(&empty).unwrap(); let json = to_string(&empty).unwrap();