Skip to content

Lurk/cloudinary_rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

158 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cloudinary

codecov crates.io Released API docs

At the moment, there is only half-backed upload and transformation functionality, but if you need more, please let me know.

Upload an image

Upload can be done from different sources:

  • local file
  • remote file
  • data url rfc2397

Local file

use std::collections::BTreeSet;
use cloudinary::upload::{Source, Upload, OptionalParameters};

let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let options = BTreeSet::from([OptionalParameters::PublicId("file.jpg".to_string())]);
let result = upload.image(Source::Path("./image.jpg".into()), &options);

Remote file

use std::collections::BTreeSet;
use cloudinary::upload::{Source, Upload, OptionalParameters};

let image_url = "https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png";
let options = BTreeSet::from([OptionalParameters::PublicId("1x1.png".to_string())]);
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.image(Source::Path("./image.jpg".into()), &options);

Data url

use std::collections::BTreeSet;
use cloudinary::upload::{Source, Upload, OptionalParameters};

let data_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
let options = BTreeSet::from([OptionalParameters::PublicId("1x1.png".to_string())]);
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.image(Source::DataUrl(data_url.to_string()), &options);

Destroy an asset by publicID

use cloudinary::upload::Upload;
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.destroy("publicID");

Transform an image

Currently supported transformations:

  • Resize
  • Crop
  • Pad

Resizing an image:

use cloudinary::transformation::{
    Transformations::Resize, resize_mode::ResizeMode::ScaleByWidth, Image, aspect_ratio::AspectRatio
};

let image = Image::new("test".into(), "path/name.png".into())
    .add_transformation(Resize(ScaleByWidth{ width:100, ar: None, liquid:None}));
assert_eq!(
    image.to_string(),
    "https://res.cloudinary.com/test/image/upload/c_scale,w_100/path/name.png"
);

Cropping an image:

use cloudinary::transformation::{
   Transformations::Crop, crop_mode::CropMode::FillByWidth, Image, aspect_ratio::AspectRatio
};

let image = Image::new("test".into(), "path/name.png".into())
    .add_transformation(Crop(FillByWidth{ width:100, ar: None, gravity: None}));

assert_eq!(
    image.to_string(),
    "https://res.cloudinary.com/test/image/upload/c_fill,w_100/path/name.png"
);

Padding an image:

use cloudinary::transformation::{
  Transformations::Pad, pad_mode::PadMode::PadByWidth, Image, aspect_ratio::AspectRatio
};

let image = Image::new("test".into(), "path/name.png".into())
    .add_transformation(Pad(PadByWidth{ width:100, ar: None, background: None, gravity: None}));
assert_eq!(
   image.to_string(),
   "https://res.cloudinary.com/test/image/upload/c_pad,w_100/path/name.png"
);

Get Image from URL

Unofficial api. This is not supported by Cloudinary, and can break at any time. Officially you should use public_id that you get from upload.

Support

use cloudinary::transformation::Image;
use url::Url;
let image = Image::try_from(
    Url::parse("https://res.cloudinary.com/test/image/upload/path/name.png").unwrap()
).unwrap();
assert_eq!(image.to_string(), "https://res.cloudinary.com/test/image/upload/path/name.png");

Get a list of all assets with a given tag

use cloudinary::tags::get_tags;
let tags = get_tags("cloud_name".into(), "tag_name".into()).await;

Development

Due to differences in default upload result shape in different accounts, two sets of credentials must be present in .env for tests to succeed.

CLOUDINARY_API_SECRET=***
CLOUDINARY_API_KEY=***
CLOUDINARY_CLOUD_NAME=***

CLOUDINARY_API_SECRET_1=***
CLOUDINARY_API_KEY_1=***
CLOUDINARY_CLOUD_NAME_1=***

Minimum supported Rust version

The minimum supported Rust version for this crate is 1.65

codecov crates.io Released API docs

At the moment, there is only half-backed upload and transformation functionality, but if you need more, please let me know.

Upload an image

Upload can be done from different sources:

  • local file
  • remote file
  • data url rfc2397

Local file

use cloudinary::upload::{UploadOptions, Source, Upload};
let options = UploadOptions::new().set_public_id("file.jpg".to_string());
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.image(Source::Path("./image.jpg".into()), &options);

Remote file

use cloudinary::upload::{UploadOptions, Source, Upload};
let image_url = "https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png";
let options = UploadOptions::new().set_public_id("1x1.png".to_string());
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.image(Source::Url(image_url.try_into().unwrap()), &options);

Data url

use cloudinary::upload::{UploadOptions, Source, Upload};
let data_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
let options = UploadOptions::new().set_public_id("1x1.png".to_string());
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.image(Source::DataUrl(data_url.into()), &options);

Destroy an asset by publicID

use cloudinary::upload::Upload;
let upload = Upload::new("api_key".to_string(), "cloud_name".to_string(), "api_secret".to_string() );
let result = upload.destroy("publicID");

Transform an image

Currently supported transformations:

  • Resize
  • Crop
  • Pad

Resizing an image:

use cloudinary::transformation::{
    Transformations::Resize, resize_mode::ResizeMode::ScaleByWidth, Image, aspect_ratio::AspectRatio
};

let image = Image::new("test".into(), "path/name.png".into())
    .add_transformation(Resize(ScaleByWidth{ width:100, ar: None, liquid:None}));
assert_eq!(
    image.to_string(),
    "https://res.cloudinary.com/test/image/upload/c_scale,w_100/path/name.png"
);

Cropping an image:

use cloudinary::transformation::{
   Transformations::Crop, crop_mode::CropMode::FillByWidth, Image, aspect_ratio::AspectRatio
};

let image = Image::new("test".into(), "path/name.png".into())
    .add_transformation(Crop(FillByWidth{ width:100, ar: None, gravity: None}));

assert_eq!(
    image.to_string(),
    "https://res.cloudinary.com/test/image/upload/c_fill,w_100/path/name.png"
);

Padding an image:

use cloudinary::transformation::{
  Transformations::Pad, pad_mode::PadMode::PadByWidth, Image, aspect_ratio::AspectRatio
};

let image = Image::new("test".into(), "path/name.png".into())
    .add_transformation(Pad(PadByWidth{ width:100, ar: None, background: None, gravity: None}));
assert_eq!(
   image.to_string(),
   "https://res.cloudinary.com/test/image/upload/c_pad,w_100/path/name.png"
);

Get Image from URL

Unofficial api. This is not supported by Cloudinary, and can break at any time. Officially you should use public_id that you get from upload.

Support

use cloudinary::transformation::Image;
use url::Url;
let image = Image::try_from(
    Url::parse("https://res.cloudinary.com/test/image/upload/path/name.png").unwrap()
).unwrap();
assert_eq!(image.to_string(), "https://res.cloudinary.com/test/image/upload/path/name.png");

Get a list of all assets with a given tag

use cloudinary::tags::get_tags;
let tags = get_tags("cloud_name".into(), "tag_name".into()).await;

Development

Due to differences in default upload result shape in different accounts, two sets of credentials must be present in .env for tests to succeed.

CLOUDINARY_API_SECRET=***
CLOUDINARY_API_KEY=***
CLOUDINARY_CLOUD_NAME=***

CLOUDINARY_API_SECRET_1=***
CLOUDINARY_API_KEY_1=***
CLOUDINARY_CLOUD_NAME_1=***

Minimum supported Rust version

MSRV: 1.83

License: MIT OR Apache-2.0

About

unofficial cloudinary rust SDK

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 9

Languages