foldr 0.2.1

Foldr, the blazing fast templating tool
use std::io::Cursor;
use std::path::PathBuf;

use crate::commands::command::{Iteration, Result, error};
use crate::config::Config;
use crate::globals::FOLDR_MANIFEST_FILE;
use crate::templates::Template;
pub struct NetworkUtil;

impl NetworkUtil {
    pub fn fetch_template(
        config: &Config,
        endpoint: String,
        name: String,
        iteration: Iteration,
    ) -> Result<Template> {
        if !endpoint.starts_with("http://") && !endpoint.starts_with("https://") {
            return Err(error("Endpoint passed is not an http(s) endpoint"));
        }

        if config.require_https && !endpoint.starts_with("https") {
            return Err(error("Non https endpoints not allowed by config"));
        }
        println!("Fetching Template From {}", endpoint.to_string());
        let mut response = ureq::get(endpoint).call().map_err(|e| {
            error(&format!(
                "Network error while fetching template over http: {}",
                e.to_string()
            ))
        })?;

        if !response.status().is_success() {
            return Err(error(&format!(
                "Failed statuscode recieved from endpoint: {}",
                response.status().as_str()
            )));
        }
        let mut buffer = response
            .body_mut()
            .read_to_vec()
            .map_err(|_| error("Error while reading template http stream"))?;
        let mut cursor = Cursor::new(&mut buffer);
        let template = Template::store(
            &config,
            name,
            iteration,
            &mut cursor,
            vec![FOLDR_MANIFEST_FILE.into()],
        )?;
        return Ok(template);
    }
    pub fn fetch_and_spawn_template(
        config: &Config,
        endpoint: String,
        spawn_path: PathBuf,
    ) -> Result<()> {
        if !endpoint.starts_with("http://") && !endpoint.starts_with("https://") {
            return Err(error("Endpoint passed is not an http(s) endpoint"));
        }

        if config.require_https && !endpoint.starts_with("https") {
            return Err(error("Non https endpoints not allowed by config"));
        }
        println!("Fetching Template From {}", endpoint.to_string());
        let mut response = ureq::get(endpoint).call().map_err(|e| {
            error(&format!(
                "Network error while fetching template over http: {}",
                e.to_string()
            ))
        })?;

        if !response.status().is_success() {
            return Err(error(&format!(
                "Failed statuscode recieved from endpoint: {}",
                response.status().as_str()
            )));
        }
        let mut buffer = response
            .body_mut()
            .read_to_vec()
            .map_err(|_| error("Error while reading template http stream"))?;
        let mut cursor = Cursor::new(&mut buffer);
        let template = Template::spawn_from_stream(
            &config,
            &spawn_path,
            &mut cursor,
            vec![FOLDR_MANIFEST_FILE.into()],
        )?;
        return Ok(template);
    }
}