What is Extensibility and Customization in Timoni?

Timoni is an open-source, extensible, and customizable toolkit for building and deploying applications. It provides several ways to extend and customize its functionality, making it adaptable to various use cases.

CUE Templates

CUE templates are a powerful way to customize the configuration files generated by Timoni. They allow users to define reusable snippets of configuration code, making it easier to manage complex configurations.

Example

Suppose you have a set of common configuration properties that you want to use across multiple services. You can create a CUE template to define these properties and reuse them in your configuration files.

package timoni
          
          @config
          config common {
            property1: "value1"
            property2: "value2"
          }
          

Now, you can import this template in your service configuration file and use the defined properties.

package myservice
          
          import "github.com/stefanprodan/timoni/configs/common"
          
          @config
          config myservice {
            import common.*
          
            property3: "value3"
          }
          

For more information on CUE templates, refer to the official documentation.

Custom Resources

Timoni allows users to define custom resources, which can be used to extend the functionality of the platform. Custom resources are written in CUE and can be used to define new types, functions, or configuration properties.

Example

Let’s say you want to define a custom resource type for a database service. You can create a new CUE file in the resources directory and define the new type.

package mydatabase
          
          @resource
          resource database {
            name: string
            connectionString: string
          }
          

Now, you can use this custom resource type in your configuration files.

package myservice
          
          import "github.com/stefanprodan/timoni/resources/mydatabase"
          
          @config
          config myservice {
            mydatabase: {
              name: "mydb"
              connectionString: "postgresql://user:password@localhost:5432/mydb"
            }
          }
          

For more information on custom resources, refer to the official documentation.

Plugins

Timoni supports plugins, which are extensions that can be used to add new functionality to the platform. Plugins can be written in various programming languages and can be used to perform tasks such as linting, testing, or deployment.

Example

Suppose you want to add a new deployment provider to Timoni. You can create a new plugin that implements the Deployer interface and register it with Timoni.

package mydeployer
          
          import (
            "github.com/stefanprodan/timoni/deploy"
          )
          
          type MyDeployer struct{}
          
          func (d *MyDeployer) Deploy(config *deploy.Config) error {
            // Implement deployment logic here
          }
          
          func init() {
            deploy.RegisterDeployer("mydeployer", new(MyDeployer))
          }
          

Now, you can use this plugin with Timoni to deploy your applications using the new deployment provider.

For more information on plugins, refer to the official documentation.