// This file is @generated by prost-build. /// A single link to another table within the same profile (schema). #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct TableLink { /// Name of an existing table within the same profile to link to. /// For each link, a "\_id" column is created on the new table. /// That column references ""(id) and adds an index automatically. #[prost(string, tag = "1")] pub linked_table_name: ::prost::alloc::string::String, /// If true, the generated foreign key column is NOT NULL. /// Otherwise the column allows NULL. /// Duplicate links to the same target table in one request are rejected. #[prost(bool, tag = "2")] pub required: bool, } /// Defines the input for creating a new table definition. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PostTableDefinitionRequest { /// Table name to create inside the target profile. /// Must be lowercase, alphanumeric with underscores, /// start with a letter, and be \<= 63 chars. /// Forbidden names: "id", "deleted", "created_at", "row_revision", or ending in "\_id". #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, /// List of links (foreign keys) to existing tables in the same profile. /// Each will automatically get a "\_id" column and an index. #[prost(message, repeated, tag = "2")] pub links: ::prost::alloc::vec::Vec, /// List of user-defined columns (adds to system/id/fk columns). #[prost(message, repeated, tag = "3")] pub columns: ::prost::alloc::vec::Vec, /// List of column names to be indexed (must match existing user-defined columns). /// Indexes can target only user-defined columns; system columns ("id", "deleted", /// "created_at", "row_revision") and automatically generated foreign key ("\*\_id") columns already /// have indexes. Requests trying to index those columns are rejected. #[prost(string, repeated, tag = "4")] pub indexes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// Name of profile (Postgres schema) where the table will be created. /// Same naming rules as table_name; cannot collide with reserved schemas /// like "public", "information_schema", or ones starting with "pg\_". #[prost(string, tag = "5")] pub profile_name: ::prost::alloc::string::String, /// Columns whose values identify a row to users in pickers, in the order /// they are shown. Each must name one of the user-defined columns above. /// Empty means the row is identified by its id alone. #[prost(string, repeated, tag = "7")] pub row_display_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// ISO-4217 currency the profile keeps its accounting in. A profile is one /// accounting entity and keeps one set of books, so this is required only when /// the request creates the profile, and is ignored afterwards. It is unrelated /// to individual MONEY-column currencies: tables may hold money in any currency, and amounts convert /// to this one when they reach the ledger. #[prost(string, tag = "8")] pub accounting_currency: ::prost::alloc::string::String, } /// Defines the input for explicitly creating tables backed by one invoice /// template. typst_source must contain exactly one field declaration: /// /// \#let komp_ac_fields = ( /// "sidlo.nazov", /// "people\[\].name", /// "people\[\].requested_quantity", /// ) /// /// A path matching an existing profile table and column becomes a reference to /// that table. Otherwise its final segment becomes a local TEXT column for an /// administrator to refine later. Every \[\] creates a child table with a required /// FK to its immediate generated parent. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CreateInvoiceTemplateTableRequest { #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, #[prost(string, tag = "2")] pub table_name: ::prost::alloc::string::String, #[prost(string, tag = "3")] pub typst_source: ::prost::alloc::string::String, #[prost(string, repeated, tag = "5")] pub row_display_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// One physical dynamic table created for an invoice template scope. The root /// has an empty collection_path and parent_table_name. Each \[\] scope names its /// collection and the generated table that owns those repeated rows. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GeneratedInvoiceTemplateTable { #[prost(string, tag = "1")] pub table_name: ::prost::alloc::string::String, #[prost(string, tag = "2")] pub collection_path: ::prost::alloc::string::String, #[prost(string, tag = "3")] pub parent_table_name: ::prost::alloc::string::String, #[prost(string, tag = "4")] pub sql: ::prost::alloc::string::String, } /// Reports the complete table bundle created from one invoice template. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateInvoiceTemplateTableResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(message, repeated, tag = "2")] pub tables: ::prost::alloc::vec::Vec, } /// Defines append-only column additions for an existing table. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct AddTableColumnsRequest { /// Existing profile/schema name. #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, /// Existing table name in the profile. #[prost(string, tag = "2")] pub table_name: ::prost::alloc::string::String, /// New user-defined columns only. Existing columns cannot be changed here. #[prost(message, repeated, tag = "3")] pub columns: ::prost::alloc::vec::Vec, /// Optional indexes for the new columns only. #[prost(string, repeated, tag = "4")] pub indexes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// Describes one user-defined column for a table. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ColumnDefinition { /// Column name that follows the same validation rules as table_name. /// Must be lowercase, start with a letter, no uppercase characters, /// and cannot be "id", "deleted", "created_at", "row_revision", or end with "\_id". #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, /// Logical column type. Supported values (case-insensitive): /// TEXT /// BOOLEAN /// INSTANT (local input resolved in the authenticated user's timezone /// and displayed in the viewer timezone) /// USER_DATETIME (local input resolved in the user's timezone) /// RAW_DATETIME (timezone-free civil datetime) /// PHONE (international or national phone number; generates extension/type/country/calling-code companions) /// TIME (timezone-free time of day) /// MONEY (= unconstrained NUMERIC; currency is declared below) /// ACCOUNTING (creates schema-managed name, account, debit, and credit fields; /// account always selects a row from the profile's managed accounts table; /// name is limited to 10 characters and one stored row contributes /// one line to the profile journal) /// ACCOUNTING_TRANSFER (creates automatic source-period/account/book/ /// denomination fields and writable target equivalents; one /// table may contain only one accounting transfer definition) /// INT /// BIGINT /// DATE /// DURATION /// PERIOD /// DECIMAL(p,s) → NUMERIC(p,s) /// DECIMAL args must be integers (no sign, no dot, no leading zeros); /// s ≤ p and p ≥ 1. #[prost(string, tag = "2")] pub field_type: ::prost::alloc::string::String, /// MONEY rounding applied before a value is stored. #[prost(enumeration = "MoneyRounding", tag = "3")] pub rounding: i32, /// When true, this numeric column is server-owned and projected from the /// profile quantity ledger. #[prost(bool, tag = "4")] pub quantity_ledger: bool, /// Canonical uppercase ISO-4217 currency code. Required for MONEY and forbidden /// for every other field type. #[prost(string, tag = "5")] pub currency: ::prost::alloc::string::String, } /// Response after table creation (success + DDL preview). #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct TableDefinitionResponse { /// True if all DB changes and metadata inserts succeeded. #[prost(bool, tag = "1")] pub success: bool, /// The actual SQL executed: CREATE TABLE + CREATE INDEX statements. #[prost(string, tag = "2")] pub sql: ::prost::alloc::string::String, } /// Describes the tree of all profiles and their tables. #[derive(Clone, PartialEq, ::prost::Message)] pub struct ProfileTreeResponse { /// All profiles in the system. #[prost(message, repeated, tag = "1")] pub profiles: ::prost::alloc::vec::Vec, } /// Nested message and enum types in `ProfileTreeResponse`. pub mod profile_tree_response { /// Table entry in a profile. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct Table { /// Internal ID from table_definitions.id (metadata record). #[prost(int64, tag = "1")] pub id: i64, /// Table name within the profile (schema). #[prost(string, tag = "2")] pub name: ::prost::alloc::string::String, /// Other tables this one references (based on link definitions only). #[prost(string, repeated, tag = "3")] pub depends_on: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, /// Columns whose values make up the human-readable row label, in order. #[prost(string, repeated, tag = "4")] pub row_display_columns: ::prost::alloc::vec::Vec< ::prost::alloc::string::String, >, /// "dynamic" for user-defined tables, "system" for backend-managed tables. #[prost(string, tag = "5")] pub table_kind: ::prost::alloc::string::String, } /// Profile (schema) entry. #[derive(Clone, PartialEq, ::prost::Message)] pub struct Profile { /// Name of the schema/profile (as stored in `schemas.name`). #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, /// All tables in that schema and their dependencies. #[prost(message, repeated, tag = "2")] pub tables: ::prost::alloc::vec::Vec, } } /// Request to fetch all tables, columns and scripts for a profile. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetProfileDetailsRequest { /// Profile (schema) name to fetch details for. #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, } /// Response with all tables, columns and scripts for a profile. #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetProfileDetailsResponse { #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, #[prost(message, repeated, tag = "2")] pub tables: ::prost::alloc::vec::Vec, } /// Request to copy one full profile into a new profile. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CopyProfileRequest { #[prost(string, tag = "1")] pub source_profile_name: ::prost::alloc::string::String, #[prost(string, tag = "2")] pub target_profile_name: ::prost::alloc::string::String, #[prost(string, repeated, tag = "3")] pub table_names: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } /// Response after copying a profile. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CopyProfileResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, #[prost(int32, tag = "3")] pub tables_copied: i32, #[prost(int32, tag = "4")] pub scripts_copied: i32, } /// Request to fetch recorded column alias rename history for one profile. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetColumnAliasRenameHistoryRequest { #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, /// Filter. When omitted, returns all tables in the profile. #[prost(int64, optional, tag = "2")] pub table_definition_id: ::core::option::Option, } /// One recorded column alias rename. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ColumnAliasRenameHistoryEntry { #[prost(int64, tag = "1")] pub id: i64, #[prost(string, tag = "2")] pub profile_name: ::prost::alloc::string::String, #[prost(int64, tag = "3")] pub table_definition_id: i64, #[prost(string, tag = "4")] pub table_name: ::prost::alloc::string::String, #[prost(string, tag = "5")] pub old_column_name: ::prost::alloc::string::String, #[prost(string, tag = "6")] pub new_column_name: ::prost::alloc::string::String, #[prost(string, tag = "7")] pub created_at: ::prost::alloc::string::String, } /// Response with stored column alias rename history rows. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetColumnAliasRenameHistoryResponse { #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, #[prost(message, repeated, tag = "2")] pub entries: ::prost::alloc::vec::Vec, } /// Describes a table with its columns and associated scripts. #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableDetail { #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, #[prost(int64, tag = "2")] pub id: i64, #[prost(message, repeated, tag = "3")] pub columns: ::prost::alloc::vec::Vec, #[prost(message, repeated, tag = "4")] pub scripts: ::prost::alloc::vec::Vec, #[prost(string, repeated, tag = "6")] pub row_display_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, #[prost(map = "string, message", tag = "7")] pub column_behaviors: ::std::collections::HashMap< ::prost::alloc::string::String, ColumnBehavior, >, #[prost(string, tag = "8")] pub table_kind: ::prost::alloc::string::String, } /// Server-owned behavior for one logical column returned in table details. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ColumnBehavior { /// True when the server created the column as a companion of another column. #[prost(bool, tag = "1")] pub generated: bool, /// True when clients must display but never submit edits for the column. #[prost(bool, tag = "2")] pub read_only: bool, /// Logical source column name, empty for ordinary user-defined columns. #[prost(string, tag = "3")] pub generated_from: ::prost::alloc::string::String, } /// A script that targets a specific column in a table. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ScriptInfo { #[prost(int64, tag = "1")] pub script_id: i64, #[prost(string, tag = "2")] pub target_column: ::prost::alloc::string::String, #[prost(string, tag = "3")] pub target_column_type: ::prost::alloc::string::String, #[prost(string, tag = "4")] pub script: ::prost::alloc::string::String, #[prost(string, tag = "5")] pub description: ::prost::alloc::string::String, } /// Request to rename one user-visible column alias in a table. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RenameColumnAliasRequest { #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, #[prost(string, tag = "2")] pub table_name: ::prost::alloc::string::String, #[prost(string, tag = "3")] pub old_column_name: ::prost::alloc::string::String, #[prost(string, tag = "4")] pub new_column_name: ::prost::alloc::string::String, } /// Response after renaming one column alias. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct RenameColumnAliasResponse { #[prost(bool, tag = "1")] pub success: bool, #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } /// Request to delete one table definition entirely. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteTableRequest { /// Profile (schema) name owning the table (must exist). #[prost(string, tag = "1")] pub profile_name: ::prost::alloc::string::String, /// Table to drop (must exist in the profile). /// Executes DROP TABLE "profile"."table" CASCADE and then removes metadata. #[prost(string, tag = "2")] pub table_name: ::prost::alloc::string::String, } /// Response after table deletion. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct DeleteTableResponse { /// True if table and metadata were successfully deleted in one transaction. #[prost(bool, tag = "1")] pub success: bool, /// Human-readable summary of what was removed. #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } /// Response listing every column type a table may declare. #[derive(Clone, PartialEq, ::prost::Message)] pub struct ListColumnTypesResponse { /// All declared column types. #[prost(message, repeated, tag = "1")] pub column_types: ::prost::alloc::vec::Vec, } /// Nested message and enum types in `ListColumnTypesResponse`. pub mod list_column_types_response { /// One declared column type and the SQL type it maps to. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ColumnType { /// Logical column type (e.g. "money", "instant"). Passed to the server as /// ColumnDefinition.field_type. #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, /// Underlying PostgreSQL type the logical type maps to (e.g. "NUMERIC"). #[prost(string, tag = "2")] pub sql_type: ::prost::alloc::string::String, } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[repr(i32)] pub enum MoneyRounding { None = 0, HalfUp = 1, } impl MoneyRounding { /// String value of the enum field names used in the ProtoBuf definition. /// /// The values are not transformed in any way and thus are considered stable /// (if the ProtoBuf definition does not change) and safe for programmatic use. pub fn as_str_name(&self) -> &'static str { match self { Self::None => "MONEY_ROUNDING_NONE", Self::HalfUp => "MONEY_ROUNDING_HALF_UP", } } /// Creates an enum from field names used in the ProtoBuf definition. pub fn from_str_name(value: &str) -> ::core::option::Option { match value { "MONEY_ROUNDING_NONE" => Some(Self::None), "MONEY_ROUNDING_HALF_UP" => Some(Self::HalfUp), _ => None, } } } /// Generated client implementations. pub mod table_definition_client { #![allow( unused_variables, dead_code, missing_docs, clippy::wildcard_imports, clippy::let_unit_value, )] use tonic::codegen::*; use tonic::codegen::http::Uri; /// The TableDefinition service manages the entire lifecycle of user-defined /// tables (stored as both metadata and physical PostgreSQL tables) inside /// logical "profiles" (schemas). Each table has stored structure, links, and /// validation rules. #[derive(Debug, Clone)] pub struct TableDefinitionClient { inner: tonic::client::Grpc, } impl TableDefinitionClient { /// Attempt to create a new client by connecting to a given endpoint. pub async fn connect(dst: D) -> Result where D: TryInto, D::Error: Into, { let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; Ok(Self::new(conn)) } } impl TableDefinitionClient where T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, { pub fn new(inner: T) -> Self { let inner = tonic::client::Grpc::new(inner); Self { inner } } pub fn with_origin(inner: T, origin: Uri) -> Self { let inner = tonic::client::Grpc::with_origin(inner, origin); Self { inner } } pub fn with_interceptor( inner: T, interceptor: F, ) -> TableDefinitionClient> where F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< http::Request, Response = http::Response< >::ResponseBody, >, >, , >>::Error: Into + std::marker::Send + std::marker::Sync, { TableDefinitionClient::new(InterceptedService::new(inner, interceptor)) } /// Compress requests with the given encoding. /// /// This requires the server to support it otherwise it might respond with an /// error. #[must_use] pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { self.inner = self.inner.send_compressed(encoding); self } /// Enable decompressing responses. #[must_use] pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { self.inner = self.inner.accept_compressed(encoding); self } /// Limits the maximum size of a decoded message. /// /// Default: `4MB` #[must_use] pub fn max_decoding_message_size(mut self, limit: usize) -> Self { self.inner = self.inner.max_decoding_message_size(limit); self } /// Limits the maximum size of an encoded message. /// /// Default: `usize::MAX` #[must_use] pub fn max_encoding_message_size(mut self, limit: usize) -> Self { self.inner = self.inner.max_encoding_message_size(limit); self } /// Creates a new table (and schema if missing) with system columns, /// linked-table foreign keys, user-defined columns, and optional indexes. /// Also inserts metadata and default validation rules. Entirely transactional. pub async fn post_table_definition( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/PostTableDefinition", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "PostTableDefinition", ), ); self.inner.unary(req, path, codec).await } /// Creates a regular user-table bundle from the restricted komp_ac_fields /// contract embedded in a Typst invoice template. This is invoked explicitly /// by the user; templates do not provision tables merely by existing. pub async fn create_invoice_template_table( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/CreateInvoiceTemplateTable", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "CreateInvoiceTemplateTable", ), ); self.inner.unary(req, path, codec).await } /// Appends new user-defined columns to an existing table. /// Existing columns, links, and table logic are never changed by this call. pub async fn add_table_columns( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/AddTableColumns", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "AddTableColumns", ), ); self.inner.unary(req, path, codec).await } /// Lists all profiles (schemas) and their tables with declared dependencies. /// This provides a tree-like overview of table relationships. pub async fn get_profile_tree( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/GetProfileTree", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "GetProfileTree", ), ); self.inner.unary(req, path, codec).await } /// Lists every column type a table may declare, along with the SQL type it /// maps to. Pure data retrieval - no business logic. pub async fn list_column_types( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/ListColumnTypes", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "ListColumnTypes", ), ); self.inner.unary(req, path, codec).await } /// Fetches all tables with their columns and scripts for a specific profile. /// Pure data retrieval - no business logic. pub async fn get_profile_details( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/GetProfileDetails", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "GetProfileDetails", ), ); self.inner.unary(req, path, codec).await } /// Copies one complete profile into a new profile without copying table data. pub async fn copy_profile( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/CopyProfile", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "CopyProfile", ), ); self.inner.unary(req, path, codec).await } /// Returns the stored rename history for column aliases in one profile. pub async fn get_column_alias_rename_history( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/GetColumnAliasRenameHistory", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "GetColumnAliasRenameHistory", ), ); self.inner.unary(req, path, codec).await } /// Renames a user-visible column alias while keeping the physical column unchanged. pub async fn rename_column_alias( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/RenameColumnAlias", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "RenameColumnAlias", ), ); self.inner.unary(req, path, codec).await } /// Drops a table and its metadata, then deletes the profile if it becomes empty. pub async fn delete_table( &mut self, request: impl tonic::IntoRequest, ) -> std::result::Result< tonic::Response, tonic::Status, > { self.inner .ready() .await .map_err(|e| { tonic::Status::unknown( format!("Service was not ready: {}", e.into()), ) })?; let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/komp_ac.table_definition.TableDefinition/DeleteTable", ); let mut req = request.into_request(); req.extensions_mut() .insert( GrpcMethod::new( "komp_ac.table_definition.TableDefinition", "DeleteTable", ), ); self.inner.unary(req, path, codec).await } } } /// Generated server implementations. pub mod table_definition_server { #![allow( unused_variables, dead_code, missing_docs, clippy::wildcard_imports, clippy::let_unit_value, )] use tonic::codegen::*; /// Generated trait containing gRPC methods that should be implemented for use with TableDefinitionServer. #[async_trait] pub trait TableDefinition: std::marker::Send + std::marker::Sync + 'static { /// Creates a new table (and schema if missing) with system columns, /// linked-table foreign keys, user-defined columns, and optional indexes. /// Also inserts metadata and default validation rules. Entirely transactional. async fn post_table_definition( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Creates a regular user-table bundle from the restricted komp_ac_fields /// contract embedded in a Typst invoice template. This is invoked explicitly /// by the user; templates do not provision tables merely by existing. async fn create_invoice_template_table( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Appends new user-defined columns to an existing table. /// Existing columns, links, and table logic are never changed by this call. async fn add_table_columns( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Lists all profiles (schemas) and their tables with declared dependencies. /// This provides a tree-like overview of table relationships. async fn get_profile_tree( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Lists every column type a table may declare, along with the SQL type it /// maps to. Pure data retrieval - no business logic. async fn list_column_types( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Fetches all tables with their columns and scripts for a specific profile. /// Pure data retrieval - no business logic. async fn get_profile_details( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Copies one complete profile into a new profile without copying table data. async fn copy_profile( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Returns the stored rename history for column aliases in one profile. async fn get_column_alias_rename_history( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Renames a user-visible column alias while keeping the physical column unchanged. async fn rename_column_alias( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; /// Drops a table and its metadata, then deletes the profile if it becomes empty. async fn delete_table( &self, request: tonic::Request, ) -> std::result::Result< tonic::Response, tonic::Status, >; } /// The TableDefinition service manages the entire lifecycle of user-defined /// tables (stored as both metadata and physical PostgreSQL tables) inside /// logical "profiles" (schemas). Each table has stored structure, links, and /// validation rules. #[derive(Debug)] pub struct TableDefinitionServer { inner: Arc, accept_compression_encodings: EnabledCompressionEncodings, send_compression_encodings: EnabledCompressionEncodings, max_decoding_message_size: Option, max_encoding_message_size: Option, } impl TableDefinitionServer { pub fn new(inner: T) -> Self { Self::from_arc(Arc::new(inner)) } pub fn from_arc(inner: Arc) -> Self { Self { inner, accept_compression_encodings: Default::default(), send_compression_encodings: Default::default(), max_decoding_message_size: None, max_encoding_message_size: None, } } pub fn with_interceptor( inner: T, interceptor: F, ) -> InterceptedService where F: tonic::service::Interceptor, { InterceptedService::new(Self::new(inner), interceptor) } /// Enable decompressing requests with the given encoding. #[must_use] pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { self.accept_compression_encodings.enable(encoding); self } /// Compress responses with the given encoding, if the client supports it. #[must_use] pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { self.send_compression_encodings.enable(encoding); self } /// Limits the maximum size of a decoded message. /// /// Default: `4MB` #[must_use] pub fn max_decoding_message_size(mut self, limit: usize) -> Self { self.max_decoding_message_size = Some(limit); self } /// Limits the maximum size of an encoded message. /// /// Default: `usize::MAX` #[must_use] pub fn max_encoding_message_size(mut self, limit: usize) -> Self { self.max_encoding_message_size = Some(limit); self } } impl tonic::codegen::Service> for TableDefinitionServer where T: TableDefinition, B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( &mut self, _cx: &mut Context<'_>, ) -> Poll> { Poll::Ready(Ok(())) } fn call(&mut self, req: http::Request) -> Self::Future { match req.uri().path() { "/komp_ac.table_definition.TableDefinition/PostTableDefinition" => { #[allow(non_camel_case_types)] struct PostTableDefinitionSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for PostTableDefinitionSvc { type Response = super::TableDefinitionResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::post_table_definition( &inner, request, ) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = PostTableDefinitionSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/CreateInvoiceTemplateTable" => { #[allow(non_camel_case_types)] struct CreateInvoiceTemplateTableSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService< super::CreateInvoiceTemplateTableRequest, > for CreateInvoiceTemplateTableSvc { type Response = super::CreateInvoiceTemplateTableResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request< super::CreateInvoiceTemplateTableRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::create_invoice_template_table( &inner, request, ) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = CreateInvoiceTemplateTableSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/AddTableColumns" => { #[allow(non_camel_case_types)] struct AddTableColumnsSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for AddTableColumnsSvc { type Response = super::TableDefinitionResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::add_table_columns(&inner, request) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = AddTableColumnsSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/GetProfileTree" => { #[allow(non_camel_case_types)] struct GetProfileTreeSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for GetProfileTreeSvc { type Response = super::ProfileTreeResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::get_profile_tree(&inner, request) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = GetProfileTreeSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/ListColumnTypes" => { #[allow(non_camel_case_types)] struct ListColumnTypesSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for ListColumnTypesSvc { type Response = super::ListColumnTypesResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::list_column_types(&inner, request) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = ListColumnTypesSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/GetProfileDetails" => { #[allow(non_camel_case_types)] struct GetProfileDetailsSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for GetProfileDetailsSvc { type Response = super::GetProfileDetailsResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::get_profile_details(&inner, request) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = GetProfileDetailsSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/CopyProfile" => { #[allow(non_camel_case_types)] struct CopyProfileSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for CopyProfileSvc { type Response = super::CopyProfileResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::copy_profile(&inner, request).await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = CopyProfileSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/GetColumnAliasRenameHistory" => { #[allow(non_camel_case_types)] struct GetColumnAliasRenameHistorySvc( pub Arc, ); impl< T: TableDefinition, > tonic::server::UnaryService< super::GetColumnAliasRenameHistoryRequest, > for GetColumnAliasRenameHistorySvc { type Response = super::GetColumnAliasRenameHistoryResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request< super::GetColumnAliasRenameHistoryRequest, >, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::get_column_alias_rename_history( &inner, request, ) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = GetColumnAliasRenameHistorySvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/RenameColumnAlias" => { #[allow(non_camel_case_types)] struct RenameColumnAliasSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for RenameColumnAliasSvc { type Response = super::RenameColumnAliasResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::rename_column_alias(&inner, request) .await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = RenameColumnAliasSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } "/komp_ac.table_definition.TableDefinition/DeleteTable" => { #[allow(non_camel_case_types)] struct DeleteTableSvc(pub Arc); impl< T: TableDefinition, > tonic::server::UnaryService for DeleteTableSvc { type Response = super::DeleteTableResponse; type Future = BoxFuture< tonic::Response, tonic::Status, >; fn call( &mut self, request: tonic::Request, ) -> Self::Future { let inner = Arc::clone(&self.0); let fut = async move { ::delete_table(&inner, request).await }; Box::pin(fut) } } let accept_compression_encodings = self.accept_compression_encodings; let send_compression_encodings = self.send_compression_encodings; let max_decoding_message_size = self.max_decoding_message_size; let max_encoding_message_size = self.max_encoding_message_size; let inner = self.inner.clone(); let fut = async move { let method = DeleteTableSvc(inner); let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, send_compression_encodings, ) .apply_max_message_size_config( max_decoding_message_size, max_encoding_message_size, ); let res = grpc.unary(method, req).await; Ok(res) }; Box::pin(fut) } _ => { Box::pin(async move { let mut response = http::Response::new( tonic::body::Body::default(), ); let headers = response.headers_mut(); headers .insert( tonic::Status::GRPC_STATUS, (tonic::Code::Unimplemented as i32).into(), ); headers .insert( http::header::CONTENT_TYPE, tonic::metadata::GRPC_CONTENT_TYPE, ); Ok(response) }) } } } } impl Clone for TableDefinitionServer { fn clone(&self) -> Self { let inner = self.inner.clone(); Self { inner, accept_compression_encodings: self.accept_compression_encodings, send_compression_encodings: self.send_compression_encodings, max_decoding_message_size: self.max_decoding_message_size, max_encoding_message_size: self.max_encoding_message_size, } } } /// Generated gRPC service name pub const SERVICE_NAME: &str = "komp_ac.table_definition.TableDefinition"; impl tonic::server::NamedService for TableDefinitionServer { const NAME: &'static str = SERVICE_NAME; } }