Skip to main content

cloudconvert_sdk/
lib.rs

1//! Async Rust SDK primitives for the CloudConvert API v2.
2//!
3//! This crate exposes typed request and response models for CloudConvert jobs
4//! and tasks, plus a [`CloudConvertClient`] for calling the API from async Rust
5//! applications. Operation-specific drift is handled through `option(...)`
6//! builder methods, `extra` maps, and [`TaskRequest::custom`].
7//!
8//! # Build jobs
9//!
10//! Use [`JobCreateRequest::linear`] when each task feeds into the next task.
11//!
12//! ```
13//! use cloudconvert_sdk::{FileExtension, JobCreateRequest};
14//!
15//! # fn main() -> cloudconvert_sdk::Result<()> {
16//! let request = JobCreateRequest::linear()
17//!     .import_url("https://example.test/input.docx")
18//!     .convert(FileExtension::Pdf)?
19//!     .export_url()?
20//!     .build();
21//!
22//! let payload = serde_json::to_value(request).unwrap();
23//! assert_eq!(payload["tasks"]["import-url"]["operation"], "import/url");
24//! assert_eq!(payload["tasks"]["convert"]["input"], "import-url");
25//! assert_eq!(payload["tasks"]["export-url"]["input"], "convert");
26//! # Ok(())
27//! # }
28//! ```
29//!
30//! Use `*_with(...)` methods to configure task-specific options while keeping a
31//! serial pipeline.
32//!
33//! ```
34//! use cloudconvert_sdk::{FileExtension, JobCreateRequest};
35//!
36//! # fn main() -> cloudconvert_sdk::Result<()> {
37//! let request = JobCreateRequest::linear()
38//!     .import_url_with("https://example.test/input.docx", |task| {
39//!         task.filename("input.docx")
40//!     })
41//!     .convert_with(FileExtension::Pdf, |task| {
42//!         task.input_format(FileExtension::Docx)
43//!     })?
44//!     .export_url()?
45//!     .build();
46//!
47//! let payload = serde_json::to_value(request).unwrap();
48//! assert_eq!(payload["tasks"]["import-url"]["filename"], "input.docx");
49//! assert_eq!(payload["tasks"]["convert"]["input_format"], "docx");
50//! # Ok(())
51//! # }
52//! ```
53//!
54//! Use [`JobCreateRequest::graph`] when a job branches, joins multiple inputs,
55//! or needs to reference a non-adjacent task.
56//!
57//! ```
58//! use cloudconvert_sdk::{FileExtension, JobCreateRequest};
59//!
60//! let request = JobCreateRequest::graph(|job| {
61//!     let import = job.import_url("https://example.test/input.docx");
62//!     let pdf = job.convert(&import, FileExtension::Pdf);
63//!     let png = job.convert(&import, FileExtension::Png);
64//!     job.export_url([&pdf, &png]);
65//! })
66//! .build();
67//!
68//! let payload = serde_json::to_value(request).unwrap();
69//! assert_eq!(payload["tasks"]["convert"]["input"], "import-url");
70//! assert_eq!(payload["tasks"]["convert-2"]["input"], "import-url");
71//! assert_eq!(
72//!     payload["tasks"]["export-url"]["input"],
73//!     serde_json::json!(["convert", "convert-2"])
74//! );
75//! ```
76//!
77//! # Call the API
78//!
79//! Live API calls need a CloudConvert API key. `ApiKey::from_env()` reads
80//! `CLOUDCONVERT_API_KEY`.
81//!
82//! ```no_run
83//! use cloudconvert_sdk::{ApiKey, CloudConvertClient, FileExtension, JobCreateRequest};
84//!
85//! # async fn run() -> cloudconvert_sdk::Result<()> {
86//! let client = CloudConvertClient::builder(ApiKey::from_env()?).build()?;
87//! let request = JobCreateRequest::linear()
88//!     .import_url("https://example.test/input.docx")
89//!     .convert(FileExtension::Pdf)?
90//!     .export_url()?
91//!     .build();
92//!
93//! let job = client.jobs().create(request).await?;
94//! let finished = client.jobs().wait(&job.id).await?;
95//! for file in finished.export_urls() {
96//!     if let Some(url) = &file.url {
97//!         let bytes = client.download(url).await?;
98//!         println!("downloaded {} bytes as {}", bytes.len(), file.filename);
99//!     }
100//! }
101//! # Ok(())
102//! # }
103//! ```
104
105mod client;
106mod config;
107mod error;
108mod file_extension;
109mod jobs;
110mod oauth;
111mod operations;
112mod resources;
113mod signed_url;
114mod socket;
115mod tasks;
116mod webhook;
117
118pub use client::{
119    CloudConvertClient, JobsResource, OperationsResource, TasksResource, UsersResource,
120    WebhooksResource,
121};
122#[cfg(feature = "retry")]
123pub use config::RetryPolicy;
124pub use config::{
125    ApiKey, ClientBuilder, CloudConvertConfig, OAuthAccessToken, OAuthClientSecret,
126    OAuthRefreshToken, Region, SigningSecret, TransportConfig,
127};
128pub use error::{ApiError, Error, InvalidBuilderState, InvalidBuilderStateKind, Result};
129pub use file_extension::{FileExtension, ParseFileExtensionError};
130pub use jobs::{
131    ApiResponse, FileResult, Job, JobBuilder, JobCreateRequest, JobGetQuery, JobGraphBuilder,
132    JobListQuery, JobStatus, JobTask, Page, PaginationLinks, PaginationMeta, RateLimit, Task,
133    TaskGetQuery, TaskListQuery, TaskName, TaskResult, TaskStatus, UploadForm,
134};
135pub use oauth::{OAuthClient, OAuthScope, OAuthTokenResponse};
136pub use operations::{
137    Operation, OperationEngineVersion, OperationListQuery, OperationOption, OperationOptionKind,
138    OperationValidationError, OperationValidationErrorKind, OperationValidationMode,
139    OperationValidationResult,
140};
141pub use resources::{User, Webhook, WebhookCreateRequest, WebhookEvent, WebhookListQuery};
142pub use signed_url::sign_job_url;
143#[cfg(feature = "socket")]
144pub use socket::{CloudConvertSocket, SocketEvent};
145pub use socket::{
146    JobSocketEvent, SocketChannel, SocketEventKind, SocketSubscription, TaskSocketEvent,
147    socket_base_url,
148};
149pub use tasks::{
150    ArchiveTask, AzureBlobExportTask, AzureBlobImportTask, Base64ImportTask, CaptureWebsiteTask,
151    CommandTask, ConvertTask, ExportUploadTask, ExportUrlTask, ExtraOptions, FontAlign,
152    GenericTask, GoogleCloudStorageExportTask, GoogleCloudStorageImportTask, ImportUploadTask,
153    ImportUrlTask, Input, Layer, MergeTask, MetadataTask, MetadataWriteTask, OpenStackExportTask,
154    OpenStackImportTask, OptimizeTask, PdfATask, PdfDecryptTask, PdfEncryptTask,
155    PdfExtractPagesTask, PdfOcrTask, PdfRotatePagesTask, PdfSplitPagesTask, PdfXTask,
156    PositionHorizontal, PositionVertical, RawImportTask, S3ExportTask, S3ImportTask,
157    SftpExportTask, SftpImportTask, TaskPayload, TaskRequest, ThumbnailTask, WatermarkTask,
158};
159pub use webhook::{sign_payload, verify_signature};