From 15b2fe7e29e8873b810bf4b399fb2b4b4c967877 Mon Sep 17 00:00:00 2001 From: lukas-heiligenbrunner Date: Tue, 26 Dec 2023 22:20:40 +0100 Subject: [PATCH] add option to get only part of output with startline --- src/api/add.rs | 12 ++++++------ src/api/backend.rs | 2 +- src/api/list.rs | 30 ++++++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/api/add.rs b/src/api/add.rs index f44bf6e..08c37c9 100644 --- a/src/api/add.rs +++ b/src/api/add.rs @@ -2,7 +2,7 @@ use crate::aur::aur::get_info_by_name; use crate::builder::types::Action; use crate::db::prelude::{Packages, Versions}; use crate::db::{packages, versions}; -use rocket::response::status::NotFound; +use rocket::response::status::BadRequest; use rocket::serde::json::Json; use rocket::serde::Deserialize; use rocket::{post, State}; @@ -25,14 +25,14 @@ pub async fn package_add( db: &State, input: Json, tx: &State>, -) -> Result<(), NotFound> { +) -> Result<(), BadRequest> { let db = db as &DatabaseConnection; let pkt_model = match Packages::find() .filter(packages::Column::Name.eq(input.name.clone())) .one(db) .await - .map_err(|e| NotFound(e.to_string()))? + .map_err(|e| BadRequest(Some(e.to_string())))? { None => { let new_package = packages::ActiveModel { @@ -47,13 +47,13 @@ pub async fn package_add( let pkg = get_info_by_name(input.name.clone().as_str()) .await - .map_err(|_| NotFound("couldn't download package metadata".to_string()))?; + .map_err(|_| BadRequest(Some("couldn't download package metadata".to_string())))?; let version_model = match Versions::find() .filter(versions::Column::Version.eq(pkg.version.clone())) .one(db) .await - .map_err(|e| NotFound(e.to_string()))? + .map_err(|e| BadRequest(Some(e.to_string())))? { None => { let new_version = versions::ActiveModel { @@ -70,7 +70,7 @@ pub async fn package_add( if input.force_build { p.into() } else { - return Err(NotFound("Version already existing".to_string())); + return Err(BadRequest(Some("Version already existing".to_string()))); } } }; diff --git a/src/api/backend.rs b/src/api/backend.rs index 97bedb5..1259e7c 100644 --- a/src/api/backend.rs +++ b/src/api/backend.rs @@ -19,6 +19,6 @@ pub fn build_api() -> Vec { package_del, version_del, build_output, - list_builds + list_builds, ] } diff --git a/src/api/list.rs b/src/api/list.rs index 5e7b4f6..9f708ac 100644 --- a/src/api/list.rs +++ b/src/api/list.rs @@ -69,10 +69,11 @@ pub async fn package_list( } #[openapi(tag = "test")] -#[get("/builds/output?")] +#[get("/builds/output?&")] pub async fn build_output( db: &State, buildid: i32, + startline: Option, ) -> Result> { let db = db as &DatabaseConnection; @@ -82,7 +83,32 @@ pub async fn build_output( .map_err(|e| NotFound(e.to_string()))? .ok_or(NotFound("couldn't find id".to_string()))?; - build.ouput.ok_or(NotFound("No Output".to_string())) + return match build.ouput { + None => Err(NotFound("No Output".to_string())), + Some(v) => match startline { + None => Ok(v), + Some(startline) => { + let output: Vec = v.split("\n").map(|x| x.to_string()).collect(); + let len = output.len(); + let len_missing = len as i32 - startline; + + let output = output + .iter() + .rev() + .take(if len_missing > 0 { + len_missing as usize + } else { + 0 + }) + .rev() + .map(|x1| x1.clone()) + .collect::>(); + + let output = output.join("\n"); + Ok(output) + } + }, + }; } #[derive(FromQueryResult, Deserialize, JsonSchema, Serialize)]