1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
use std::{borrow::Cow, fmt};
use crate::{
datamodel::attributes::{BlockAttribute, FieldAttribute},
value::{Array, Constant, Function, Text, Value},
};
use super::IndexFieldInput;
/// Defines the id attribute in a model block.
#[derive(Debug)]
pub struct IdDefinition<'a>(BlockAttribute<'a>);
impl<'a> IdDefinition<'a> {
/// Sets the model's primary key to the given fields.
///
/// ```ignore
/// @@id([foo, bar])
/// // ^^^^^^^^^^ here
/// ```
pub fn new(fields: impl Iterator<Item = IndexFieldInput<'a>>) -> Self {
let mut inner = Function::new("id");
let fields: Vec<_> = fields.map(Function::from).map(Value::Function).collect();
inner.push_param(Value::Array(Array::from(fields)));
Self(BlockAttribute(inner))
}
/// Sets a client name for the id.
///
/// ```ignore
/// @@id([foo, bar], name: "Foo")
/// // ^^^^^ here
/// ```
pub fn name(&mut self, name: impl Into<Cow<'a, str>>) {
self.0.push_param(("name", Text::new(name.into())));
}
/// The primary key constraint name.
///
/// ```ignore
/// @@id([foo, bar], map: "Foo")
/// // ^^^^^ here
/// ```
pub fn map(&mut self, map: impl Into<Cow<'a, str>>) {
self.0.push_param(("map", Text::new(map)));
}
/// The constraint clustering setting.
///
/// ```ignore
/// @@id([foo, bar], clustered: false)
/// // ^^^^^ here
/// ```
pub fn clustered(&mut self, clustered: bool) {
self.0.push_param(("clustered", Constant::new_no_validate(clustered)));
}
}
impl<'a> fmt::Display for IdDefinition<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
/// Defines the id attribute in a field.
#[derive(Debug)]
pub struct IdFieldDefinition<'a>(FieldAttribute<'a>);
impl<'a> IdFieldDefinition<'a> {
/// Makes the given field to be the model's primary key.
///
/// ```ignore
/// field Int @id
/// // ^^^ here
/// ```
pub fn new() -> Self {
Self(FieldAttribute::new(Function::new("id")))
}
/// The primary key constraint name.
///
/// ```ignore
/// field Int @id(map: "Foo")
/// // ^^^^^ here
/// ```
pub fn map(&mut self, map: impl Into<Cow<'a, str>>) {
self.0.push_param(("map", Text::new(map.into())));
}
/// The constraint clustering setting.
///
/// ```ignore
/// field Int @id(clustered: false)
/// // ^^^^^ here
/// ```
pub fn clustered(&mut self, clustered: bool) {
self.0.push_param(("clustered", Constant::new_no_validate(clustered)));
}
/// The constraint sort setting.
///
/// ```ignore
/// field Int @id(sort: Desc)
/// // ^^^^ here
/// ```
pub fn sort_order(&mut self, sort: impl Into<Cow<'a, str>>) {
self.0.push_param(("sort", Constant::new_no_validate(sort.into())));
}
/// The constraint length setting.
///
/// ```ignore
/// field Int @id(length: 32)
/// // ^^ here
/// ```
pub fn length(&mut self, length: u32) {
self.0.push_param(("length", Constant::new_no_validate(length)));
}
}
impl<'a> Default for IdFieldDefinition<'a> {
fn default() -> Self {
Self::new()
}
}
impl<'a> fmt::Display for IdFieldDefinition<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}