With the rollout of Twilio's OpenAPI specification, it is now possible to auto-generate your own Twilio client in your preferred programming language.
One language that Twilio currently does not have an official SDK for is Rust. By using the Twilio OpenAPI specification with open source tools such as OpenAPI Generator, you can now generate a strongly-typed Rust client for Twilio's API methods.
To begin, install OpenAPI Generator. If you are on a Mac, we recommend installing using Homebrew for ease of use as below:
brew install openapi-generator
Once OpenAPI Generator is installed, the next step is to generate your very first Twilio client in Rust. Paste the following code snippet into your terminal to pull in the Twilio OpenAPI spec from GitHub, generate a client, and save the resulting client code to a directory named twilio-rust
.
1openapi-generator generate -g rust \2-i https://raw.githubusercontent.com/twilio/twilio-oai/main/spec/json/twilio_api_v2010.json \3-o twilio-rust \4--additional-properties=useSingleRequestParameter=true
Refer to the configuration documentation for the Rust generator to see other ways you can customize the generated library to your needs.
Now that the client has been generated, it's time to create some code that will enable you to interact with Twilio's API in Rust. If you don't already have Rust installed, you can install Rust by following the instructions as described in their documentation.
With Rust installed, create a new Rust project. We suggest that you use cargo
to simplify this process and run the following command from the same directory where you executed the codegen process:
cargo new twilio-rust-example
This will scaffold out a Rust project for you, with the necessary main.rs
file and a Cargo.toml
file for managing dependencies.
1.2├── src3│ └── main.rs4└── Cargo.toml
In order to make use of the generated Twilio client, it must be added to the project's Cargo.toml
. More specifically, it should be added as a path dependency, since it is a crate currently residing on your local file system instead of crates.io or a similar repository.
Let's add two more dependencies as well:
dotenv
to enable access to environment variables from a local
.env
file
tokio
which provides an asynchronous runtime environment so that your code can use
async/await
You can manually edit Cargo.toml
to include these dependencies, but we suggest leveraging a tool such as cargo-edit to manage dependencies. Once you have installed cargo-edit
, run the following commands:
1cargo add openapi --path=../twilio-rust2cargo add dotenv3cargo add tokio --features rt,rt-multi-thread,macros
Once cargo-edit
has completed (or you skipped that step and did things manually), Cargo.toml
will reflect the following contents:
1[package]2name = "twilio-rust-example"3version = "0.1.0"4edition = "2021"56# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html78[dependencies]9dotenv = "0.15.0"10openapi = { path = "../twilio-rust" }11tokio = { version = "1.21.1", features = ["rt", "rt-multi-thread", "macros"] }
The specific versions of dotenv
and tokio
may vary from this example depending on when you are coming across this tutorial. Using cargo-edit
as shown above will ensure you're on the latest version of each.
Once you've saved those changes to Cargo.toml
, run the following command to install all of the above dependencies.
cargo build
Now that our dependencies are in order, it's time to create a program in Rust.
We will leverage environment variables in order to securely access your Twilio credentials, so the next step is to create a .env
file at the root of your Rust project and provide the necessary values. Be sure to replace the placeholder values here with your own credentials and a non-Twilio phone number such as your own as TO_NUMBER
. Ensure that your phone numbers are declared in the E.164 format (+1234567890).
1TWILIO_API_KEY=SKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2TWILIO_API_KEY_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3TWILIO_ACCOUNT_SID=ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX4TWILIO_PHONE_NUMBER=+10987654325TO_NUMBER=+1234567890
Note that we're using best practices here, and creating the Twilio client using an API Key and Secret instead of directly using and potentially exposing your account's auth token. If you'd like to learn more about API Keys and how to create one, please refer to the API Keys documentation!
With the environment variables in place, it's time to open src/main.rs
and replace the boilerplate code there with the following sample:
1use dotenv;2use openapi::apis::{3configuration::Configuration,4default_api::{self as twilio_api, CreateMessageParams},5};6use std::env;78#[tokio::main]9async fn main() {10// Securely import sensitive credentials and values from your .env file11dotenv::dotenv().expect("Failed to read .env file");12let account_sid = env::var("TWILIO_ACCOUNT_SID")13.expect("env variable `TWILIO_ACCOUNT_SID` should be set");14let api_key = env::var("TWILIO_API_KEY")15.expect("env variable `TWILIO_API_KEY` should be set");16let api_key_secret = env::var("TWILIO_API_KEY_SECRET")17.expect("env variable `TWILIO_API_KEY_SECRET` should be set");18let from = env::var("TWILIO_PHONE_NUMBER")19.expect("env variable `TWILIO_PHONE_NUMBER` should be set");20let to = env::var("TO_NUMBER").expect("env variable `TO_NUMBER` should be set");2122// Create a new configuration for your Twilio client.23let twilio_config = Configuration {24basic_auth: Some((api_key, Some(api_key_secret))),25..Default::default()26};2728// Define the message that you wish to send29let message_params = CreateMessageParams {30account_sid,31to,32from: Some(from),33body: Some("Ahoy, Rustacean! 🦀".into()),34..Default::default()35};3637// Asynchronously send the message from your Twilio phone number.38let message = twilio_api::create_message(&twilio_config, message_params).await;3940match message {41Ok(result) => {42println!("Message sent with SID {}", result.sid.unwrap().unwrap())43}44Err(error) => eprintln!("Error sending message: {}", error),45};46}47
Execute cargo run
in your terminal, and you will see a log output of the message's SID as well as an SMS appear on your intended phone shortly after.
1$ cargo run2Finished dev [unoptimized + debuginfo] target(s) in 0.15s3Running `target/debug/twilio-rust-example`4Message sent with SID "SMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"