#![allow(unused)]
use crate::{
asset::Asset,
manifest::{self, Manifest},
};
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Chunk {
pub(crate) file: String,
#[serde(default)]
pub(crate) src: Option<String>,
#[serde(default)]
pub(crate) name: Option<String>,
#[serde(default)]
pub(crate) is_entry: bool,
#[serde(default)]
pub(crate) is_dynamic_entry: bool,
#[serde(default)]
pub(crate) is_implicit_entry: bool,
#[serde(default)]
pub(crate) is_legacy_entry: bool,
#[serde(default)]
pub(crate) integrity: Option<String>,
#[serde(default)]
pub(crate) imports: Vec<String>,
#[serde(default)]
pub(crate) dynamic_imports: Vec<String>,
#[serde(default)]
pub(crate) css: Vec<String>,
#[serde(default)]
pub(crate) assets: Vec<String>,
}
#[derive(PartialEq)]
enum ChunkIterListTrack {
Assets,
Css,
Eot, }
impl ChunkIterListTrack {
pub fn start() -> Self {
Self::Assets
}
}
struct ChunkIter<'a> {
assets: &'a [String],
imports: &'a [String],
index: usize,
css: &'a [String],
track: ChunkIterListTrack,
prefix: Option<&'a str>,
app_url: &'a str,
}
impl Chunk {
pub fn assets_iter(
&self,
prefix: Option<&'static str>,
app_url: &'static str,
) -> impl Iterator<Item = Asset> + '_ {
ChunkIter {
assets: &self.assets,
imports: &self.imports,
css: &self.css,
index: 0,
track: ChunkIterListTrack::start(),
prefix,
app_url,
}
}
}
impl Iterator for ChunkIter<'_> {
type Item = Asset;
fn next(&mut self) -> Option<Self::Item> {
if self.track == ChunkIterListTrack::Assets {
if let Some(asset) = self.assets.get(self.index) {
self.index += 1;
return Some(Asset::pre_load(asset.clone(), self.prefix, self.app_url));
} else {
self.track = ChunkIterListTrack::Css;
self.index = 0;
}
}
if self.track == ChunkIterListTrack::Css {
if let Some(css) = self.css.get(self.index) {
self.index += 1;
return Some(Asset::style_sheet(css.clone(), self.prefix, self.app_url));
} else {
self.track = ChunkIterListTrack::Eot;
self.index = 0;
}
}
None
}
}