Start to implement energy consumption backend
This commit is contained in:
		
							
								
								
									
										1
									
								
								central_backend/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								central_backend/Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -455,6 +455,7 @@ dependencies = [
 | 
			
		||||
 "log",
 | 
			
		||||
 "openssl",
 | 
			
		||||
 "openssl-sys",
 | 
			
		||||
 "rand",
 | 
			
		||||
 "reqwest",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "serde_json",
 | 
			
		||||
 
 | 
			
		||||
@@ -20,3 +20,4 @@ futures = "0.3.30"
 | 
			
		||||
serde = { version = "1.0.203", features = ["derive"] }
 | 
			
		||||
reqwest = "0.12.5"
 | 
			
		||||
serde_json = "1.0.118"
 | 
			
		||||
rand = "0.8.5"
 | 
			
		||||
@@ -1,6 +1,24 @@
 | 
			
		||||
use clap::Parser;
 | 
			
		||||
use clap::{Parser, Subcommand};
 | 
			
		||||
use std::path::{Path, PathBuf};
 | 
			
		||||
 | 
			
		||||
/// Electrical consumption fetcher backend
 | 
			
		||||
#[derive(Subcommand, Debug, Clone)]
 | 
			
		||||
pub enum ConsumptionBackend {
 | 
			
		||||
    /// Constant consumption value
 | 
			
		||||
    Constant {
 | 
			
		||||
        #[clap(long, default_value_t = 500)]
 | 
			
		||||
        value: i32,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    /// Generate random consumption value
 | 
			
		||||
    Random {
 | 
			
		||||
        #[clap(long, default_value_t = -5000)]
 | 
			
		||||
        min: i32,
 | 
			
		||||
        #[clap(long, default_value_t = 20000)]
 | 
			
		||||
        max: i32,
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Solar system central backend
 | 
			
		||||
#[derive(Parser, Debug)]
 | 
			
		||||
#[command(version, about, long_about = None)]
 | 
			
		||||
@@ -20,6 +38,10 @@ pub struct AppConfig {
 | 
			
		||||
    /// Server storage path
 | 
			
		||||
    #[arg(short, long, env, default_value = "storage")]
 | 
			
		||||
    storage: String,
 | 
			
		||||
 | 
			
		||||
    /// Consumption backend provider
 | 
			
		||||
    #[clap(subcommand)]
 | 
			
		||||
    pub consumption_backend: Option<ConsumptionBackend>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
lazy_static::lazy_static! {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								central_backend/src/energy/consumption.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								central_backend/src/energy/consumption.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
use crate::app_config::{AppConfig, ConsumptionBackend};
 | 
			
		||||
use rand::{thread_rng, Rng};
 | 
			
		||||
 | 
			
		||||
pub type EnergyConsumption = i32;
 | 
			
		||||
 | 
			
		||||
/// Get current electrical energy consumption
 | 
			
		||||
pub async fn get_curr_consumption() -> anyhow::Result<EnergyConsumption> {
 | 
			
		||||
    let backend = AppConfig::get()
 | 
			
		||||
        .consumption_backend
 | 
			
		||||
        .as_ref()
 | 
			
		||||
        .unwrap_or(&ConsumptionBackend::Constant { value: 300 });
 | 
			
		||||
 | 
			
		||||
    match backend {
 | 
			
		||||
        ConsumptionBackend::Constant { value } => Ok(*value),
 | 
			
		||||
 | 
			
		||||
        ConsumptionBackend::Random { min, max } => Ok(thread_rng().gen_range(*min..*max)),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								central_backend/src/energy/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								central_backend/src/energy/mod.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
pub mod consumption;
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
pub mod app_config;
 | 
			
		||||
pub mod crypto;
 | 
			
		||||
pub mod energy;
 | 
			
		||||
pub mod server;
 | 
			
		||||
pub mod utils;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								central_backend/src/server/energy_controller.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								central_backend/src/server/energy_controller.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
use crate::energy::consumption;
 | 
			
		||||
use crate::server::custom_error::HttpResult;
 | 
			
		||||
use actix_web::HttpResponse;
 | 
			
		||||
 | 
			
		||||
#[derive(serde::Serialize)]
 | 
			
		||||
struct CurrConsumption {
 | 
			
		||||
    consumption: i32,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Get current energy consumption
 | 
			
		||||
pub async fn curr_consumption() -> HttpResult {
 | 
			
		||||
    let consumption = consumption::get_curr_consumption().await?;
 | 
			
		||||
 | 
			
		||||
    Ok(HttpResponse::Ok().json(CurrConsumption { consumption }))
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,7 @@ use crate::app_config::AppConfig;
 | 
			
		||||
use crate::crypto::pki;
 | 
			
		||||
 | 
			
		||||
pub mod custom_error;
 | 
			
		||||
pub mod energy_controller;
 | 
			
		||||
pub mod pki_controller;
 | 
			
		||||
pub mod server_controller;
 | 
			
		||||
 | 
			
		||||
@@ -48,6 +49,10 @@ pub async fn secure_server() -> anyhow::Result<()> {
 | 
			
		||||
        App::new()
 | 
			
		||||
            .wrap(Logger::default())
 | 
			
		||||
            .route("/", web::get().to(server_controller::secure_home))
 | 
			
		||||
            .route(
 | 
			
		||||
                "/api/energy/curr_consumption",
 | 
			
		||||
                web::get().to(energy_controller::curr_consumption),
 | 
			
		||||
            )
 | 
			
		||||
    })
 | 
			
		||||
    .bind_openssl(&AppConfig::get().listen_address, builder)?
 | 
			
		||||
    .run()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user