use base64::Engine;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(transparent)]
pub struct RetryToken(pub Vec<Option<String>>);
impl RetryToken {
pub fn clone_slice(&self, range: std::ops::Range<usize>) -> Self {
let len = range.end.saturating_sub(range.start);
let mut out = Vec::with_capacity(len);
for i in range.start..range.end {
out.push(self.0.get(i).cloned().unwrap_or(None));
}
RetryToken(out)
}
pub fn push(&mut self, other: RetryToken) {
self.0.extend(other.0)
}
pub fn insert(&mut self, index: usize, other: RetryToken) {
for (i, token) in other.0.into_iter().enumerate() {
self.0[index + i] = token;
}
}
pub fn to_string(&self) -> String {
let json = serde_json::to_string(self).unwrap();
base64::engine::general_purpose::STANDARD.encode(json)
}
pub fn try_from_string(s: &str) -> Option<Self> {
let json = base64::engine::general_purpose::STANDARD.decode(s).ok()?;
let token = serde_json::from_slice(&json).ok()?;
Some(token)
}
}