Rust API reference
App
The App
struct represents a Teo server app.
new
Create an app.
Examples
Create an app
let app = App::new();
main_namespace
Retrieve the main namespace from the app. Namespace is where models, handlers,
decorators and pipeline items are defined. See Namespace
.
Examples
Retrieve the main namespace
let main_namespace = app.main_namespace();
setup
Attach some code to run after the database is connected.
Examples
Run custom setup code
app.setup(|teo: Teo| async move {
// list all users
println!("{:?}", teo.user().find_many().await?);
Ok(())
});
program
Define a custom program to run with Teo CLI.
Examples
Define a custom program
app.program("listAllUsers", Some("description"), |teo: Teo| async move {
// list all users
println!("{:?}", teo.user().find_many().await?);
Ok(())
});
run
Start the Teo server app.
Example
Run an server app
app.run().await
Namespace
Namespace is where things are defined and organized.
is_main
Whether the namespace is the main namespace.
is_std
Whether the namespace is the builtin standard namespace.
path
Get the namespace's path.
Example
Namespace's path
let namespace_path: Vec<&str> = namespace.path();
namespace
Get the namespace's child namespace by name or None
.
namespace_or_create
Get the namespace's child namespace. If not present, create and return.
namespace_at_path
Get the namespace's child namespace at path.
namespace_or_create_at_path
The the namespace's child namespace at path. If not present, create and return.
define_model_decorator
Define a new model decorator on a namespace.
Example
Define a custom model decorator
namespace.define_model_decorator("myDecorator", |arguments: Arguments, model: &mut Model| {
model.data.insert("customDataKey".to_owned(), "customDataValue".into());
});
define_model_field_decorator
Define a new model field decorator on a namespace.
Example
Define a custom model field decorator
namespace.define_model_field_decorator("myDecorator", |arguments: Arguments, field: &mut Field| {
field.data.insert("customDataKey".to_owned(), "customDataValue".into());
});
define_model_relation_decorator
Define a new model relation decorator on a namespace.
Example
Define a custom model relation decorator
namespace.define_model_relation_decorator("myDecorator", |arguments: Arguments, relation: &mut Relation| {
relation.data.insert("customDataKey".to_owned(), "customDataValue".into());
});
define_model_property_decorator
Define a new model property decorator on a namespace.
Example
Define a custom model property decorator
namespace.define_model_relation_decorator("myDecorator", |arguments: Arguments, relation: &mut Property| {
property.data.insert("customDataKey".to_owned(), "customDataValue".into());
});
define_pipeline_item
Define a custom pipeline item on a namespace.
Example
Define a custom pipeline item
namespace.define_pipeline_item("today", |args: Arguments, ctx: Ctx| async move {
Ok(Object::from(Utc::now().date_naive()))
});
define_transform_pipeline_item
Define a transformer pipeline item. This is a shortcut to define_pipeline_item
.
Example
Define a custom transformer
app.main_namespace().define_transform_pipeline_item("append0", |string: String| async {
string + "0"
});
Define a custom transformer which errors
app.main_namespace().define_transform_pipeline_item("abs", |i: i32| async {
if i < 0 {
Ok(i.abs())
} else {
Err(Error::new("cannot calculate"))
}
});
define_validator_pipeline_item
Define a validator pipeline item. This is a shortcut to define_pipeline_item
.
Example
Define a custom validator pipeline item with bool return value
app.main_namespace().define_validator_pipeline_item("numberIsEven", |n: i32| async move {
n % 2 == 0
});
Define a custom validator pipeline item with string return value
app.main_namespace().define_validator_pipeline_item("numberIsEven", |n: i32| async move {
if n % 2 == 0 {
None
} else {
Some("value is not even")
}
});
Define a custom validator pipeline item which errors
app.main_namespace().define_validator_pipeline_item("largerThan15", |i: i32| async move {
if i < 0 {
Err(Error::new("value is negative"))
} else if i <= 15 {
Ok(Some("value should be larger than 15".to_owned()))
} else {
Ok(None)
}
});
define_callback_pipeline_item
Define a callback pipeline item. This is a shortcut to define_pipeline_item
.
Example
Define a custom callback pipeline item
app.main_namespace().define_callback_pipeline_item("customCallback", |user: User| async {
// do something with the value
Ok(())
});
Define a custom callback pipeline item which errors
app.main_namespace().define_callback_pipeline_item("customCallback", |user: User| async {
if do_something() {
Err(Error::new("error occurred"))
} else {
Ok(())
}
});
define_compare_pipeline_item
Define a compare pipeline item. This is a shortcut to define_pipeline_item
.
Example
Define a custom compare pipeline item
app.main_namespace().define_compare_pipeline_item("compare", |old: String, new: String| async {
// do some callback with the old value and the new value
// return a validation result if the new value is invalid
Ok::<(), Error>(())
});
define_middleware
Define a middleware on a namespace.
Example
Define a custom middleware
app.main_namespace().define_middleware("timing", |arguments: Arguments| {
Ok(middleware_wrap_fn(move |ctx: Ctx, next: &'static dyn Next| async move {
let start = SystemTime::now();
let res = next.call(ctx).await?;
let end = SystemTime::now();
let duration = end.duration_since(start).unwrap();
println!("duration: {:?}", duration);
return Ok(res);
}))
});
define_handler
Define a custom route handler on a namespace.
Example
Define a custom route handler
app.main_namespace().define_handler("myHandler", |request: Request, teo: Teo, ctx: Ctx| async move {
let captures = ctx.handler_match().captures();
Ok(Response::data(Value::String(captures.get("id").unwrap().to_owned())))
});
define_handler_group
Define a handler group on a namespace.
Example
Define a custom handler group
app.main_namespace().define_handler_group("MyHandlerGroup", |group| {
group.define_handler("myHandler", |request: Request, teo: Teo, ctx: Ctx| async move {
let captures = ctx.handler_match().captures();
Ok(Response::data(Value::String(captures.get("id").unwrap().to_owned())))
});
});
define_model_handler_group
Define model handlers on a namespace.
Example
Define a custom model handler group
app.main_namespace().define_model_handler_group("User", |group| {
group.define_handler("myHandler", |request: Request, teo: Teo, ctx: Ctx| async move {
let captures = ctx.handler_match().captures();
Ok(Response::data(Value::String(captures.get("id").unwrap().to_owned())))
});
});
handler::Group
A handler group is a container for defining custom route handlers.
define_handler
Define a custom route handler on a handler group.
Example
Define a custom route handler
app.main_namespace().define_handler_group("MyHandlerGroup", |group| {
group.define_handler("myHandler", |request: Request, teo: Teo, ctx: Ctx| async move {
let captures = ctx.handler_match().captures();
Ok(Response::data(Value::String(captures.get("id").unwrap().to_owned())))
});
});
Request
A request represents an HTTP request.
method
Retrieve the request's method.
path
Retrieve the request's path.
query_string
Retrieve the request's query string.
content_type
Retrieve the request's content type.
headers
Retrieve the request's headers.
readonly::HeaderMap
The HeaderMap
struct represents readonly headers on a request.
keys
Retrieve the header map's keys.
len
Retrieve the length of the header map.
contains_key
Whether the headers contain a specific key.
get
Retrieve the value of a header entry by key
.
Response
The Response
struct represents an HTTP response.
empty
Create an empty response.
Example
Create an empty response
Response::empty()
string
Create a string response.
Example
Create a simple text response
Response::string("Hello, world!", "text/plain")
teon
Create a Teon response.
html
Create an HTML response.
Example
Create an HTML response
Response::html("<html><body>Hello, world!</body></html>")
data
Create a Teon response which contains a data
field.
data_meta
Create a Teon response which contains a data
field and a meta
field.
error
Create an error response.
file
Create a file response.
Example
Create a file response
Response::file(PathBuf::from("a.txt"))
redirect
Create a redirect response.
Example
Create a redirect response
Response::redirect("https://example.com")
set_code
Set the response code.
code
Retrieve the response code.
headers
Retrieve the response headers.
body
Retrieve the response body.
readwrite::HeaderMap
The HeaderMap
struct represents readwrite headers on a response.
keys
Retrieve the header map's keys.
len
Retrieve the length of the header map.
contains_key
Whether the headers contain a specific key.
get
Retrieve the value of a header entry by key
.
set
Set a new value of a header entry at key
.
Body
Represents a response body.
is_empty
Whether this response body is empty.
is_file
Whether this response body is a file.
as_file
Retrieve the file response path.
is_text
Whether this response body is text.
as_text
Retrieve the text response string.
is_teon
Whether this response body is teon.
as_teon
Retrieve the response teon value.
teon!
Declare a Teo extended JSON object.
Examples
Declare a Teon object
teon!({
"name": "My name",
"age": 12,
"sex": Sex::MALE,
"position": null,
})
Entity model
API documentation for generated model entities.
find_many
Find many objects with params same as findMany
handler.
Signature
pub async fn find_many(finder: &Value) -> Result<Vec<Self>>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Examples
Find all users
let users = teo.user().find_many(&teon!({})).await?;
Find users filtered by name
let users = teo.user().find_many(&teon!({
"where": {
"name": "John"
}
})).await?;
Find users ordered by createdAt
let users = teo.user().find_many(&teon!({
"orderBy": {
"createdAt": "desc"
}
})).await?;
Find users with posts
let users = teo.user().find_many(&teon!({
"include": {
"posts": true
}
})).await?
find_unique
Find a unique object with params same as find_unique
handler.
Signature
pub async fn find_unique(finder: &Value) -> Result<Option<Self>>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Examples
Find a unique user
let user = teo.user().find_unique(&teon!({
"where": {
"id": 1
}
})).await?;
find_first
Find an object with params same as find_first
handler.
Signature
pub async fn find_first(finder: &Value) -> Result<Option<Self>>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Examples
Find a user
let user = teo.user().find_first(&teon!({
"where": {
"age": 20
}
})).await?;
count_objects
Count objects in the model.
Signature
pub async fn count_objects(&self, query: impl Borrow<Value>) -> Result<usize>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Examples
Count objects
let number_of_objects = teo.user().count_objects(teon!({})).await?;
count_fields
Count fields in the model.
Signature
pub async fn count_fields(&self, query: impl Borrow<Value>) -> Result<ModelCountAggregateResult>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Examples
Count objects
let count_result = teo.user().count_fields(teon!({
"select": {
"createdAt": true
}
})).await?;
aggregate
Aggregate on the model.
Signature
pub async fn aggregate(&self, query: impl Borrow<Value>) -> Result<ModelAggregateResult>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Examples
Aggregate on the model
let aggregate_result = teo.user().aggregate(teon!({})).await?;
group_by
Group by on the model.
Signature
pub async fn group_by(&self, query: impl Borrow<Value>) -> Result<Vec<ModelAggregateResult>>
Arguments
Name | Required | Type | Description |
---|---|---|---|
finder | Yes | &Value | The finder |
Example
Group by on the model
let group_by_result = teo.record().group_by(teon!({
"by": "name"
})).await?;
new
Create a new model object.
Signature
pub async fn new(values: impl AsRef<Value>) -> Self
Arguments
Name | Required | Type | Description |
---|---|---|---|
values | Yes | impl AsRef<Value> | The create data |
Examples
Create a new Post
let post = Post::new(teon!({ "title": "Post 1" })).await;
default
Create an empty model object.
Signature
pub async fn default() -> Self
Examples
Create a default empty post
let post = Post::default().await;
Entity object
is_new
Returns true if object is new.
Signature
pub async fn is_new(&self) -> bool
Examples
Check if a post is new
let is_new = post.is_new();
is_modified
Returns true if object is modified.
Signature
pub async fn is_modified(&self) -> bool
Examples
Check if a post is modified
let is_modified = post.is_modified();
set
Set values to an object. The onSet
pipeline is triggered.
Signature
pub async fn set(&self, values: impl AsRef<Value>) -> Result<()>
Arguments
Name | Required | Type | Description |
---|---|---|---|
values | Yes | impl AsRef<Value> | The set data |
Examples
Set values to a user
user.set(teon!({ "name": "Peter", "age": 15 })).await?;
update
Update values on an object.
Signature
pub async fn update(&self, values: impl AsRef<Value>) -> Result<()>
Arguments
Name | Required | Type | Description |
---|---|---|---|
values | Yes | impl AsRef<Value> | The update data |
Examples
Update values on a user
user.update(teon!({ "name": "Peter", "age": 15 })).await?;
save
Save an object.
Signature
pub async fn save(&self) -> Result<()>
Examples
Save a post
post.save().await?;
delete
Delete an object.
Signature
pub async fn delete(&self) -> Result<()>
Examples
Delete a post
post.delete().await?;
to_teon
Convert the object to a teon Value
.
Signature
pub async fn to_teon(&self) -> Result<Value>
Examples
Convert an object to teon
let value = object.to_teon().await?;