use std::collections::VecDeque;
use crate::{PendingFragmentContent, Result};
use fastly::Request;
use quick_xml::Writer;
pub struct Fragment {
pub(crate) request: Request,
pub(crate) alt: Option<Result<Request>>,
pub(crate) continue_on_error: bool,
pub(crate) pending_content: PendingFragmentContent,
}
pub struct Task {
pub queue: VecDeque<Element>,
pub output: Writer<Vec<u8>>,
pub status: FetchState,
}
impl Default for Task {
fn default() -> Self {
Self {
queue: VecDeque::new(),
output: Writer::new(Vec::new()),
status: FetchState::default(),
}
}
}
impl Task {
pub fn new() -> Self {
Self::default()
}
}
pub enum Element {
Raw(Vec<u8>),
Include(Box<Fragment>),
Try {
except_task: Box<Task>,
attempt_task: Box<Task>,
},
}
pub enum FetchState {
Failed(Request, u16),
Pending,
Succeeded,
}
impl Clone for FetchState {
fn clone(&self) -> Self {
match self {
Self::Failed(req, res) => Self::Failed(req.clone_without_body(), *res),
Self::Pending => Self::Pending,
Self::Succeeded => Self::Succeeded,
}
}
}
impl Default for FetchState {
fn default() -> Self {
Self::Pending
}
}
impl std::fmt::Debug for Element {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Raw(_) => write!(f, "Raw"),
Self::Include(fragment) if fragment.alt.is_some() => {
write!(f, "Include Fragment(with alt)")
}
Self::Include(_) => write!(f, "Include Fragment"),
Self::Try {
attempt_task,
except_task,
} => write!(
f,
"Try - Attempt: {:?}, Except: {:?}",
attempt_task.queue, except_task.queue
),
}
}
}