bool>) -> Self {
let mut resource_dir = resource_dir(dir.as_ref());
// Aplica el filtro si está definido.
if let Some(f) = filter {
resource_dir.with_filter(f);
}
// Identifica el directorio temporal de recursos.
StaticFilesBundle { resource_dir }
}
/// Prepara un recurso CSS minimizado a partir de la compilación de un archivo SCSS (que puede a
/// su vez importar otros archivos SCSS).
///
/// # Argumentos
///
/// * `path` - Archivo SCSS a compilar.
/// * `target_name` - Nombre para el archivo CSS.
///
/// # Ejemplo
///
/// ```rust,no_run
/// use pagetop_build::StaticFilesBundle;
///
/// fn main() -> std::io::Result<()> {
/// StaticFilesBundle::from_scss("./bootstrap/scss/main.scss", "bootstrap.min.css")
/// .with_name("bootstrap_css")
/// .build()
/// }
/// ```
pub fn from_scss(path: P, target_name: &str) -> Self
where
P: AsRef,
{
// Crea un directorio temporal para el archivo CSS.
let out_dir = std::env::var("OUT_DIR").unwrap();
let temp_dir = Path::new(&out_dir).join("from_scss_files");
// Limpia el directorio temporal de ejecuciones previas, si existe.
if temp_dir.exists() {
remove_dir_all(&temp_dir).unwrap_or_else(|e| {
panic!(
"Failed to clean temporary directory `{}`: {e}",
temp_dir.display()
);
});
}
create_dir_all(&temp_dir).unwrap_or_else(|e| {
panic!(
"Failed to create temporary directory `{}`: {e}",
temp_dir.display()
);
});
// Compila SCSS a CSS.
let css_content = from_path(
path.as_ref(),
&Options::default().style(OutputStyle::Compressed),
)
.unwrap_or_else(|e| {
panic!(
"Failed to compile SCSS file `{}`: {e}",
path.as_ref().display(),
)
});
// Guarda el archivo CSS compilado en el directorio temporal.
let css_path = temp_dir.join(target_name);
File::create(&css_path)
.unwrap_or_else(|_| panic!("Failed to create CSS file `{}`", css_path.display()))
.write_all(css_content.as_bytes())
.unwrap_or_else(|_| panic!("Failed to write CSS content to `{}`", css_path.display()));
// Identifica el directorio temporal de recursos.
StaticFilesBundle {
resource_dir: resource_dir(temp_dir.to_str().unwrap()),
}
}
/// Asigna un nombre al conjunto de recursos.
pub fn with_name(mut self, name: impl AsRef) -> Self {
let name = name.as_ref();
let out_dir = std::env::var("OUT_DIR").unwrap();
let filename = Path::new(&out_dir).join(format!("{name}.rs"));
self.resource_dir.with_generated_filename(filename);
self.resource_dir.with_module_name(format!("bundle_{name}"));
self.resource_dir.with_generated_fn(name);
self
}
/// Contruye finalmente el conjunto de recursos para incluir en el binario de la aplicación.
pub fn build(self) -> std::io::Result<()> {
self.resource_dir.build()
}
}