blob: 8fbc78b6a16e4a05a03b729912b5ddb9eed746ae [file] [log] [blame]
// Copyright 2016 Masaki Hara
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use std::fmt::{self,Display};
use std::prelude::v1::*;
/// A type that represents object identifiers.
///
/// This is actually a thin wrapper of `Vec<u64>`.
///
/// # Examples
///
/// ```
/// use yasna::models::ObjectIdentifier;
/// let sha384WithRSAEncryption = ObjectIdentifier::from_slice(&
/// [1, 2, 840, 113549, 1, 1, 12]);
/// println!("{}", sha384WithRSAEncryption);
/// ```
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct ObjectIdentifier {
components: Vec<u64>,
}
impl ObjectIdentifier {
/// Constructs a new `ObjectIdentifier` from `Vec<u64>`.
///
/// # Examples
///
/// ```
/// use yasna::models::ObjectIdentifier;
/// let pkcs1 = ObjectIdentifier::new(
/// [1, 2, 840, 113549, 1, 1].to_vec());
/// println!("{}", pkcs1);
/// ```
pub fn new(components: Vec<u64>) -> Self {
return ObjectIdentifier {
components: components,
};
}
/// Constructs a new `ObjectIdentifier` from `&[u64]`.
///
/// # Examples
///
/// ```
/// use yasna::models::ObjectIdentifier;
/// let pkcs1 = ObjectIdentifier::from_slice(&
/// [1, 2, 840, 113549, 1, 1]);
/// println!("{}", pkcs1);
/// ```
pub fn from_slice(components: &[u64]) -> Self {
return ObjectIdentifier {
components: components.to_vec(),
};
}
/// Borrows its internal vector of components.
///
/// # Examples
///
/// ```
/// use yasna::models::ObjectIdentifier;
/// let pkcs1 = ObjectIdentifier::from_slice(&
/// [1, 2, 840, 113549, 1, 1]);
/// let components : &Vec<u64> = pkcs1.components();
/// ```
pub fn components(&self) -> &Vec<u64> {
&self.components
}
/// Mutably borrows its internal vector of components.
///
/// # Examples
///
/// ```
/// use yasna::models::ObjectIdentifier;
/// let mut pkcs1 = ObjectIdentifier::from_slice(&
/// [1, 2, 840, 113549, 1, 1]);
/// let components : &mut Vec<u64> = pkcs1.components_mut();
/// ```
pub fn components_mut(&mut self) -> &mut Vec<u64> {
&mut self.components
}
/// Extracts its internal vector of components.
///
/// # Examples
///
/// ```
/// use yasna::models::ObjectIdentifier;
/// let pkcs1 = ObjectIdentifier::from_slice(&
/// [1, 2, 840, 113549, 1, 1]);
/// let mut components : Vec<u64> = pkcs1.into_components();
/// ```
pub fn into_components(self) -> Vec<u64> {
self.components
}
}
impl Display for ObjectIdentifier {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
let mut fst = true;
for &component in &self.components {
if fst {
try!(write!(f, "{{{}", component));
} else {
try!(write!(f, " {}", component));
}
fst = false;
}
try!(write!(f, "}}"));
return Ok(());
}
}