use crate::resources::Pipeline;
use crate::schema::variables;
use crate::Database;
use diesel::prelude::*;
use serde::{Deserialize, Serialize};
use std::convert::AsRef;
#[derive(Clone, Debug, Deserialize, Serialize, Associations, Identifiable, Queryable)]
#[belongs_to(Pipeline)]
#[table_name = "variables"]
pub(crate) struct Variable {
pub(crate) id: i32,
pub(crate) key: String,
pub(crate) description: Option<String>,
pub(crate) pipeline_id: i32,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub(crate) struct VariableValue {
pub(crate) key: String,
pub(crate) value: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, Insertable)]
#[table_name = "variables"]
pub(crate) struct NewVariable<'a> {
key: &'a str,
description: Option<&'a str>,
pipeline_id: Option<i32>,
}
impl<'a> NewVariable<'a> {
pub(crate) const fn new(key: &'a str, description: Option<&'a str>) -> Self {
Self {
key,
description,
pipeline_id: None,
}
}
pub(crate) fn add_to_pipeline(
mut self,
conn: &Database,
pipeline: &Pipeline,
) -> QueryResult<()> {
use crate::schema::variables::dsl::*;
self.pipeline_id = Some(pipeline.id);
diesel::insert_into(variables)
.values(&self)
.execute(&**conn)
.map(|_| ())
}
}
pub(crate) mod graphql {
use super::*;
use crate::resources::Pipeline;
use juniper::{object, FieldResult, GraphQLInputObject, ID};
#[derive(Debug, Clone, Deserialize, Serialize, GraphQLInputObject)]
pub(crate) struct CreateVariableInput {
pub(crate) key: String,
pub(crate) description: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize, GraphQLInputObject)]
pub(crate) struct VariableValueInput {
pub(crate) key: String,
pub(crate) value: String,
}
#[object(Context = Database)]
impl Variable {
fn id() -> ID {
ID::new(self.id.to_string())
}
fn key() -> &str {
self.key.as_ref()
}
fn description() -> Option<&str> {
self.description.as_ref().map(String::as_ref)
}
fn pipeline(context: &Database) -> FieldResult<Option<Pipeline>> {
use crate::schema::pipelines::dsl::*;
pipelines
.filter(id.eq(self.pipeline_id))
.first(&**context)
.map(Some)
.map_err(Into::into)
}
}
}
impl<'a> From<&'a graphql::CreateVariableInput> for NewVariable<'a> {
fn from(input: &'a graphql::CreateVariableInput) -> Self {
Self::new(&input.key, input.description.as_ref().map(String::as_ref))
}
}
impl From<graphql::VariableValueInput> for VariableValue {
fn from(input: graphql::VariableValueInput) -> Self {
Self {
key: input.key,
value: input.value,
}
}
}