sarpro 0.3.2

A high-performance Sentinel-1 Synthetic Aperture Radar (SAR) GRD product to image processor.
Documentation
use tracing::info;

use sarpro::io::sentinel1::TargetCrsArg;
use sarpro::io::SafeReader;
use sarpro::io::credentials::CredentialProvider;

use crate::cli::args::CliArgs;
use crate::cli::errors::AppError;

use super::common::{map_resample_alg, map_target_crs, parse_target_size, map_bit_depth, derive_output_path_for_zip};
use super::save_dispatch::resolve_polarization_and_save_image;
use super::materialize::materialize_zip;

pub fn process_safe_zip_url(args: &CliArgs) -> Result<(), Box<dyn std::error::Error>> {
    let zip_url = args.safe_zip_url.as_ref().unwrap();
    let output_arg = args.output.clone().ok_or(AppError::MissingArgument { arg: "--output".to_string() })?;

    let resample_alg = map_resample_alg(args);
    let target_arg: Option<TargetCrsArg> = map_target_crs(args);
    let target_size = parse_target_size(args)?;

    let href = materialize_zip(
        zip_url,
        &args.remote_cache_dir,
        args.http_timeout,
        args.http_retries as u8,
        args.http_backoff_ms,
    )?;

    let output = derive_output_path_for_zip(&href, &output_arg, args.format);

    if args.remote_cache_dir.is_none() && zip_url.contains("asf.alaska.edu") {
        let mut asf = sarpro::io::credentials::AsfProvider::new(args.http_timeout);
        let _ = asf.prepare();
    }

    let reader = SafeReader::open_from_safe_zip_url(
        &href,
        args.polarization,
        target_arg,
        resample_alg,
        target_size,
    )?;

    let bit_depth_enum = map_bit_depth(args);
    resolve_polarization_and_save_image(
        &reader,
        args.polarization,
        output.as_path(),
        args.format,
        bit_depth_enum,
        target_size,
        args.synrgb_mode,
        args.pad,
        args.autoscale,
    )?;
    info!("Successfully processed remote SAFE ZIP: {:?} -> {:?}", zip_url, output);
    Ok(())
}