#![allow(unused)]
use serde::Deserialize;
use crate::{asset::Asset, manifest::{self, Manifest}};
#[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 {
return Self::Assets;
}
}
struct ChunkIter<'a> {
assets: &'a [String],
imports: &'a [String],
index: usize,
css: &'a [String],
track: ChunkIterListTrack,
}
impl Chunk {
pub fn assets_iter<'a>(&'a self) -> impl Iterator<Item = Asset> + 'a {
return ChunkIter {
assets: &self.assets,
imports: &self.imports,
css: &self.css,
index: 0,
track: ChunkIterListTrack::start(),
};
}
}
impl<'a> Iterator for ChunkIter<'a> {
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::Preload(asset.clone()))
} 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::StyleSheet(css.clone()))
} else {
self.track = ChunkIterListTrack::EOT;
self.index = 0;
}
}
return None;
}
}