extern crate alloc;
use alloc::borrow::ToOwned;
use alloc::string::{String, ToString};
use alloc::vec::Vec;
use core::cmp::Ordering;
use core::fmt::Display;
use super::Serializer;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct Recorder {
history: Vec<Record>,
}
#[derive(Clone, Debug)]
pub enum Record<K = String, V = String> {
Parameter(K, V),
ParameterEncoded(K, V),
Callback,
ConsumerKey,
Nonce,
SignatureMethod,
Timestamp,
Token,
Verifier,
Version,
}
impl Recorder {
pub fn new() -> Self {
Default::default()
}
pub fn history(&self) -> &[Record] {
&self.history
}
}
impl Serializer for Recorder {
type Output = Vec<Record>;
fn serialize_parameter<V>(&mut self, key: &str, value: V)
where
V: Display,
{
self.history
.push(Record::Parameter(key.to_owned(), value.to_string()));
}
fn serialize_parameter_encoded<V>(&mut self, key: &str, value: V)
where
V: Display,
{
self.history
.push(Record::ParameterEncoded(key.to_owned(), value.to_string()));
}
fn serialize_oauth_callback(&mut self) {
self.history.push(Record::Callback);
}
fn serialize_oauth_consumer_key(&mut self) {
self.history.push(Record::ConsumerKey);
}
fn serialize_oauth_nonce(&mut self) {
self.history.push(Record::Nonce);
}
fn serialize_oauth_signature_method(&mut self) {
self.history.push(Record::SignatureMethod);
}
fn serialize_oauth_timestamp(&mut self) {
self.history.push(Record::Timestamp);
}
fn serialize_oauth_token(&mut self) {
self.history.push(Record::Token);
}
fn serialize_oauth_verifier(&mut self) {
self.history.push(Record::Verifier);
}
fn serialize_oauth_version(&mut self) {
self.history.push(Record::Version);
}
fn end(self) -> Self::Output {
self.history
}
}
impl<K, V> Record<K, V> {
pub const OAUTH_PARAMETERS: [Self; 8] = [
Record::Callback,
Record::ConsumerKey,
Record::Nonce,
Record::SignatureMethod,
Record::Timestamp,
Record::Token,
Record::Verifier,
Record::Version,
];
}
impl<K, V, K2, V2> PartialEq<Record<K2, V2>> for Record<K, V>
where
K: AsRef<str>,
V: Display,
K2: AsRef<str>,
V2: Display,
{
fn eq(&self, other: &Record<K2, V2>) -> bool {
match (self, other) {
(&Record::Parameter(ref k1, ref v1), &Record::Parameter(ref k2, ref v2))
| (
&Record::ParameterEncoded(ref k1, ref v1),
&Record::ParameterEncoded(ref k2, ref v2),
) => k1.as_ref() == k2.as_ref() && fmt_cmp::cmp(v1, v2) == Ordering::Equal,
(&Record::Callback, &Record::Callback)
| (&Record::ConsumerKey, &Record::ConsumerKey)
| (&Record::Nonce, &Record::Nonce)
| (&Record::SignatureMethod, &Record::SignatureMethod)
| (&Record::Timestamp, &Record::Timestamp)
| (&Record::Token, &Record::Token)
| (&Record::Verifier, &Record::Verifier)
| (&Record::Version, &Record::Version) => true,
_ => false,
}
}
}
impl<K, V> Eq for Record<K, V>
where
K: AsRef<str>,
V: Display,
{
}