diff --git a/.optimize-cache.json b/.optimize-cache.json
index 9eb3fa11ae..ce3696453f 100644
--- a/.optimize-cache.json
+++ b/.optimize-cache.json
@@ -162,6 +162,7 @@
"images/blog/announcing-appwrite-pro/credits.png": "285905e1fd8b8282cb45a4f2259debd851812c23665145d865e141f5133c0be0",
"images/blog/announcing-appwrite-pro/header.png": "ab709ff45870607ec4472bd4dc9e4a028e320bbfb89009ec04c98ec69248a15a",
"images/blog/announcing-appwrite-pro/pro.png": "01427f30610de4d6d19cd9160154d8849ffa75da04d063d12bf3e9bba481b4e7",
+ "images/blog/announcing-appwrite-rust-sdk/cover.png": "b5b69e19f4fc1ac5eb985016c1b058bb9ed308680197f315f3b9b861f3377310",
"images/blog/announcing-atomic-numeric-operations/cover.png": "9fbe339856b8040eb49fb01ca4353b5600609962ab8044dcfc34ffbe0e8a9738",
"images/blog/announcing-auto-increment-support/cover.png": "83a7b1dd0e31ae86e49fa873cde0b6c0319a552b27dc447b4a214efd7f3fd534",
"images/blog/announcing-bulk-api/cover.png": "78a0fdf3b54ce8412bf6be1880eb4a42bcac2cb04420045a60bce888c8999c6f",
diff --git a/src/icons/optimized/rust.svg b/src/icons/optimized/rust.svg
new file mode 100644
index 0000000000..350ce08d06
--- /dev/null
+++ b/src/icons/optimized/rust.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/output/_variables.scss b/src/icons/output/_variables.scss
index dcaa908c0a..2a0a56c17d 100644
--- a/src/icons/output/_variables.scss
+++ b/src/icons/output/_variables.scss
@@ -5,63 +5,64 @@ $web-icon-refine: "\ea04";
$web-icon-microsoft: "\ea05";
$web-icon-platform: "\ea06";
$web-icon-vue: "\ea07";
-$web-icon-chevron-down: "\ea08";
-$web-icon-firebase: "\ea09";
-$web-icon-github: "\ea0a";
-$web-icon-ticket: "\ea0b";
-$web-icon-sparkle: "\ea0c";
-$web-icon-divider-vertical: "\ea0d";
-$web-icon-nuxt: "\ea0e";
-$web-icon-chevron-up: "\ea0f";
-$web-icon-ycombinator: "\ea10";
-$web-icon-x: "\ea11";
-$web-icon-textmagic: "\ea12";
-$web-icon-daily-dev: "\ea13";
-$web-icon-chevron-right: "\ea14";
-$web-icon-instagram: "\ea15";
-$web-icon-ext-link: "\ea16";
-$web-icon-arrow-right: "\ea17";
-$web-icon-edge: "\ea18";
-$web-icon-download: "\ea19";
-$web-icon-dark: "\ea1a";
-$web-icon-bluesky: "\ea1b";
-$web-icon-plus: "\ea1c";
-$web-icon-check: "\ea1d";
-$web-icon-close: "\ea1e";
-$web-icon-copy: "\ea1f";
-$web-icon-message: "\ea20";
-$web-icon-play: "\ea21";
-$web-icon-remix: "\ea22";
-$web-icon-skills: "\ea23";
-$web-icon-hamburger-menu: "\ea24";
-$web-icon-google: "\ea25";
-$web-icon-rest: "\ea26";
-$web-icon-star: "\ea27";
-$web-icon-mailgun: "\ea28";
-$web-icon-regions: "\ea29";
-$web-icon-youtube: "\ea2a";
-$web-icon-command: "\ea2b";
-$web-icon-logout-right: "\ea2c";
-$web-icon-tanstack: "\ea2d";
-$web-icon-location: "\ea2e";
-$web-icon-arrow-up: "\ea2f";
-$web-icon-linkedin: "\ea30";
-$web-icon-arena: "\ea31";
-$web-icon-twitter: "\ea32";
-$web-icon-customize: "\ea33";
-$web-icon-discord: "\ea34";
-$web-icon-calendar: "\ea35";
-$web-icon-arrow-left: "\ea36";
-$web-icon-sendgrid: "\ea37";
-$web-icon-pop-locations: "\ea38";
-$web-icon-product-hunt: "\ea39";
-$web-icon-appwrite: "\ea3a";
-$web-icon-arrow-ext-link: "\ea3b";
-$web-icon-logout-left: "\ea3c";
-$web-icon-external-icon: "\ea3d";
-$web-icon-apple: "\ea3e";
-$web-icon-tiktok: "\ea3f";
-$web-icon-minus: "\ea40";
-$web-icon-chevron-left: "\ea41";
-$web-icon-light: "\ea42";
-$web-icon-mcp: "\ea43";
+$web-icon-rust: "\ea08";
+$web-icon-chevron-down: "\ea09";
+$web-icon-firebase: "\ea0a";
+$web-icon-github: "\ea0b";
+$web-icon-ticket: "\ea0c";
+$web-icon-sparkle: "\ea0d";
+$web-icon-divider-vertical: "\ea0e";
+$web-icon-nuxt: "\ea0f";
+$web-icon-chevron-up: "\ea10";
+$web-icon-ycombinator: "\ea11";
+$web-icon-x: "\ea12";
+$web-icon-textmagic: "\ea13";
+$web-icon-daily-dev: "\ea14";
+$web-icon-chevron-right: "\ea15";
+$web-icon-instagram: "\ea16";
+$web-icon-ext-link: "\ea17";
+$web-icon-arrow-right: "\ea18";
+$web-icon-edge: "\ea19";
+$web-icon-download: "\ea1a";
+$web-icon-dark: "\ea1b";
+$web-icon-bluesky: "\ea1c";
+$web-icon-plus: "\ea1d";
+$web-icon-check: "\ea1e";
+$web-icon-close: "\ea1f";
+$web-icon-copy: "\ea20";
+$web-icon-message: "\ea21";
+$web-icon-play: "\ea22";
+$web-icon-remix: "\ea23";
+$web-icon-skills: "\ea24";
+$web-icon-hamburger-menu: "\ea25";
+$web-icon-google: "\ea26";
+$web-icon-rest: "\ea27";
+$web-icon-star: "\ea28";
+$web-icon-mailgun: "\ea29";
+$web-icon-regions: "\ea2a";
+$web-icon-youtube: "\ea2b";
+$web-icon-command: "\ea2c";
+$web-icon-logout-right: "\ea2d";
+$web-icon-tanstack: "\ea2e";
+$web-icon-location: "\ea2f";
+$web-icon-arrow-up: "\ea30";
+$web-icon-linkedin: "\ea31";
+$web-icon-arena: "\ea32";
+$web-icon-twitter: "\ea33";
+$web-icon-customize: "\ea34";
+$web-icon-discord: "\ea35";
+$web-icon-calendar: "\ea36";
+$web-icon-arrow-left: "\ea37";
+$web-icon-sendgrid: "\ea38";
+$web-icon-pop-locations: "\ea39";
+$web-icon-product-hunt: "\ea3a";
+$web-icon-appwrite: "\ea3b";
+$web-icon-arrow-ext-link: "\ea3c";
+$web-icon-logout-left: "\ea3d";
+$web-icon-external-icon: "\ea3e";
+$web-icon-apple: "\ea3f";
+$web-icon-tiktok: "\ea40";
+$web-icon-minus: "\ea41";
+$web-icon-chevron-left: "\ea42";
+$web-icon-light: "\ea43";
+$web-icon-mcp: "\ea44";
diff --git a/src/icons/output/info.json b/src/icons/output/info.json
index d978b129ba..49f9c070ed 100644
--- a/src/icons/output/info.json
+++ b/src/icons/output/info.json
@@ -41,364 +41,370 @@
"className": "web-icon-vue",
"unicode": ""
},
- "chevron-down": {
+ "rust": {
"encodedCode": "\\ea08",
"prefix": "web-icon",
- "className": "web-icon-chevron-down",
+ "className": "web-icon-rust",
"unicode": ""
},
- "firebase": {
+ "chevron-down": {
"encodedCode": "\\ea09",
"prefix": "web-icon",
- "className": "web-icon-firebase",
+ "className": "web-icon-chevron-down",
"unicode": ""
},
- "github": {
+ "firebase": {
"encodedCode": "\\ea0a",
"prefix": "web-icon",
- "className": "web-icon-github",
+ "className": "web-icon-firebase",
"unicode": ""
},
- "ticket": {
+ "github": {
"encodedCode": "\\ea0b",
"prefix": "web-icon",
- "className": "web-icon-ticket",
+ "className": "web-icon-github",
"unicode": ""
},
- "sparkle": {
+ "ticket": {
"encodedCode": "\\ea0c",
"prefix": "web-icon",
- "className": "web-icon-sparkle",
+ "className": "web-icon-ticket",
"unicode": ""
},
- "divider-vertical": {
+ "sparkle": {
"encodedCode": "\\ea0d",
"prefix": "web-icon",
- "className": "web-icon-divider-vertical",
+ "className": "web-icon-sparkle",
"unicode": ""
},
- "nuxt": {
+ "divider-vertical": {
"encodedCode": "\\ea0e",
"prefix": "web-icon",
- "className": "web-icon-nuxt",
+ "className": "web-icon-divider-vertical",
"unicode": ""
},
- "chevron-up": {
+ "nuxt": {
"encodedCode": "\\ea0f",
"prefix": "web-icon",
- "className": "web-icon-chevron-up",
+ "className": "web-icon-nuxt",
"unicode": ""
},
- "ycombinator": {
+ "chevron-up": {
"encodedCode": "\\ea10",
"prefix": "web-icon",
- "className": "web-icon-ycombinator",
+ "className": "web-icon-chevron-up",
"unicode": ""
},
- "x": {
+ "ycombinator": {
"encodedCode": "\\ea11",
"prefix": "web-icon",
- "className": "web-icon-x",
+ "className": "web-icon-ycombinator",
"unicode": ""
},
- "textmagic": {
+ "x": {
"encodedCode": "\\ea12",
"prefix": "web-icon",
- "className": "web-icon-textmagic",
+ "className": "web-icon-x",
"unicode": ""
},
- "daily-dev": {
+ "textmagic": {
"encodedCode": "\\ea13",
"prefix": "web-icon",
- "className": "web-icon-daily-dev",
+ "className": "web-icon-textmagic",
"unicode": ""
},
- "chevron-right": {
+ "daily-dev": {
"encodedCode": "\\ea14",
"prefix": "web-icon",
- "className": "web-icon-chevron-right",
+ "className": "web-icon-daily-dev",
"unicode": ""
},
- "instagram": {
+ "chevron-right": {
"encodedCode": "\\ea15",
"prefix": "web-icon",
- "className": "web-icon-instagram",
+ "className": "web-icon-chevron-right",
"unicode": ""
},
- "ext-link": {
+ "instagram": {
"encodedCode": "\\ea16",
"prefix": "web-icon",
- "className": "web-icon-ext-link",
+ "className": "web-icon-instagram",
"unicode": ""
},
- "arrow-right": {
+ "ext-link": {
"encodedCode": "\\ea17",
"prefix": "web-icon",
- "className": "web-icon-arrow-right",
+ "className": "web-icon-ext-link",
"unicode": ""
},
- "edge": {
+ "arrow-right": {
"encodedCode": "\\ea18",
"prefix": "web-icon",
- "className": "web-icon-edge",
+ "className": "web-icon-arrow-right",
"unicode": ""
},
- "download": {
+ "edge": {
"encodedCode": "\\ea19",
"prefix": "web-icon",
- "className": "web-icon-download",
+ "className": "web-icon-edge",
"unicode": ""
},
- "dark": {
+ "download": {
"encodedCode": "\\ea1a",
"prefix": "web-icon",
- "className": "web-icon-dark",
+ "className": "web-icon-download",
"unicode": ""
},
- "bluesky": {
+ "dark": {
"encodedCode": "\\ea1b",
"prefix": "web-icon",
- "className": "web-icon-bluesky",
+ "className": "web-icon-dark",
"unicode": ""
},
- "plus": {
+ "bluesky": {
"encodedCode": "\\ea1c",
"prefix": "web-icon",
- "className": "web-icon-plus",
+ "className": "web-icon-bluesky",
"unicode": ""
},
- "check": {
+ "plus": {
"encodedCode": "\\ea1d",
"prefix": "web-icon",
- "className": "web-icon-check",
+ "className": "web-icon-plus",
"unicode": ""
},
- "close": {
+ "check": {
"encodedCode": "\\ea1e",
"prefix": "web-icon",
- "className": "web-icon-close",
+ "className": "web-icon-check",
"unicode": ""
},
- "copy": {
+ "close": {
"encodedCode": "\\ea1f",
"prefix": "web-icon",
- "className": "web-icon-copy",
+ "className": "web-icon-close",
"unicode": ""
},
- "message": {
+ "copy": {
"encodedCode": "\\ea20",
"prefix": "web-icon",
- "className": "web-icon-message",
+ "className": "web-icon-copy",
"unicode": ""
},
- "play": {
+ "message": {
"encodedCode": "\\ea21",
"prefix": "web-icon",
- "className": "web-icon-play",
+ "className": "web-icon-message",
"unicode": ""
},
- "remix": {
+ "play": {
"encodedCode": "\\ea22",
"prefix": "web-icon",
- "className": "web-icon-remix",
+ "className": "web-icon-play",
"unicode": ""
},
- "skills": {
+ "remix": {
"encodedCode": "\\ea23",
"prefix": "web-icon",
- "className": "web-icon-skills",
+ "className": "web-icon-remix",
"unicode": ""
},
- "hamburger-menu": {
+ "skills": {
"encodedCode": "\\ea24",
"prefix": "web-icon",
- "className": "web-icon-hamburger-menu",
+ "className": "web-icon-skills",
"unicode": ""
},
- "google": {
+ "hamburger-menu": {
"encodedCode": "\\ea25",
"prefix": "web-icon",
- "className": "web-icon-google",
+ "className": "web-icon-hamburger-menu",
"unicode": ""
},
- "rest": {
+ "google": {
"encodedCode": "\\ea26",
"prefix": "web-icon",
- "className": "web-icon-rest",
+ "className": "web-icon-google",
"unicode": ""
},
- "star": {
+ "rest": {
"encodedCode": "\\ea27",
"prefix": "web-icon",
- "className": "web-icon-star",
+ "className": "web-icon-rest",
"unicode": ""
},
- "mailgun": {
+ "star": {
"encodedCode": "\\ea28",
"prefix": "web-icon",
- "className": "web-icon-mailgun",
+ "className": "web-icon-star",
"unicode": ""
},
- "regions": {
+ "mailgun": {
"encodedCode": "\\ea29",
"prefix": "web-icon",
- "className": "web-icon-regions",
+ "className": "web-icon-mailgun",
"unicode": ""
},
- "youtube": {
+ "regions": {
"encodedCode": "\\ea2a",
"prefix": "web-icon",
- "className": "web-icon-youtube",
+ "className": "web-icon-regions",
"unicode": ""
},
- "command": {
+ "youtube": {
"encodedCode": "\\ea2b",
"prefix": "web-icon",
- "className": "web-icon-command",
+ "className": "web-icon-youtube",
"unicode": ""
},
- "logout-right": {
+ "command": {
"encodedCode": "\\ea2c",
"prefix": "web-icon",
- "className": "web-icon-logout-right",
+ "className": "web-icon-command",
"unicode": ""
},
- "tanstack": {
+ "logout-right": {
"encodedCode": "\\ea2d",
"prefix": "web-icon",
- "className": "web-icon-tanstack",
+ "className": "web-icon-logout-right",
"unicode": ""
},
- "location": {
+ "tanstack": {
"encodedCode": "\\ea2e",
"prefix": "web-icon",
- "className": "web-icon-location",
+ "className": "web-icon-tanstack",
"unicode": ""
},
- "arrow-up": {
+ "location": {
"encodedCode": "\\ea2f",
"prefix": "web-icon",
- "className": "web-icon-arrow-up",
+ "className": "web-icon-location",
"unicode": ""
},
- "linkedin": {
+ "arrow-up": {
"encodedCode": "\\ea30",
"prefix": "web-icon",
- "className": "web-icon-linkedin",
+ "className": "web-icon-arrow-up",
"unicode": ""
},
- "arena": {
+ "linkedin": {
"encodedCode": "\\ea31",
"prefix": "web-icon",
- "className": "web-icon-arena",
+ "className": "web-icon-linkedin",
"unicode": ""
},
- "twitter": {
+ "arena": {
"encodedCode": "\\ea32",
"prefix": "web-icon",
- "className": "web-icon-twitter",
+ "className": "web-icon-arena",
"unicode": ""
},
- "customize": {
+ "twitter": {
"encodedCode": "\\ea33",
"prefix": "web-icon",
- "className": "web-icon-customize",
+ "className": "web-icon-twitter",
"unicode": ""
},
- "discord": {
+ "customize": {
"encodedCode": "\\ea34",
"prefix": "web-icon",
- "className": "web-icon-discord",
+ "className": "web-icon-customize",
"unicode": ""
},
- "calendar": {
+ "discord": {
"encodedCode": "\\ea35",
"prefix": "web-icon",
- "className": "web-icon-calendar",
+ "className": "web-icon-discord",
"unicode": ""
},
- "arrow-left": {
+ "calendar": {
"encodedCode": "\\ea36",
"prefix": "web-icon",
- "className": "web-icon-arrow-left",
+ "className": "web-icon-calendar",
"unicode": ""
},
- "sendgrid": {
+ "arrow-left": {
"encodedCode": "\\ea37",
"prefix": "web-icon",
- "className": "web-icon-sendgrid",
+ "className": "web-icon-arrow-left",
"unicode": ""
},
- "pop-locations": {
+ "sendgrid": {
"encodedCode": "\\ea38",
"prefix": "web-icon",
- "className": "web-icon-pop-locations",
+ "className": "web-icon-sendgrid",
"unicode": ""
},
- "product-hunt": {
+ "pop-locations": {
"encodedCode": "\\ea39",
"prefix": "web-icon",
- "className": "web-icon-product-hunt",
+ "className": "web-icon-pop-locations",
"unicode": ""
},
- "appwrite": {
+ "product-hunt": {
"encodedCode": "\\ea3a",
"prefix": "web-icon",
- "className": "web-icon-appwrite",
+ "className": "web-icon-product-hunt",
"unicode": ""
},
- "arrow-ext-link": {
+ "appwrite": {
"encodedCode": "\\ea3b",
"prefix": "web-icon",
- "className": "web-icon-arrow-ext-link",
+ "className": "web-icon-appwrite",
"unicode": ""
},
- "logout-left": {
+ "arrow-ext-link": {
"encodedCode": "\\ea3c",
"prefix": "web-icon",
- "className": "web-icon-logout-left",
+ "className": "web-icon-arrow-ext-link",
"unicode": ""
},
- "external-icon": {
+ "logout-left": {
"encodedCode": "\\ea3d",
"prefix": "web-icon",
- "className": "web-icon-external-icon",
+ "className": "web-icon-logout-left",
"unicode": ""
},
- "apple": {
+ "external-icon": {
"encodedCode": "\\ea3e",
"prefix": "web-icon",
- "className": "web-icon-apple",
+ "className": "web-icon-external-icon",
"unicode": ""
},
- "tiktok": {
+ "apple": {
"encodedCode": "\\ea3f",
"prefix": "web-icon",
- "className": "web-icon-tiktok",
+ "className": "web-icon-apple",
"unicode": ""
},
- "minus": {
+ "tiktok": {
"encodedCode": "\\ea40",
"prefix": "web-icon",
- "className": "web-icon-minus",
+ "className": "web-icon-tiktok",
"unicode": ""
},
- "chevron-left": {
+ "minus": {
"encodedCode": "\\ea41",
"prefix": "web-icon",
- "className": "web-icon-chevron-left",
+ "className": "web-icon-minus",
"unicode": ""
},
- "light": {
+ "chevron-left": {
"encodedCode": "\\ea42",
"prefix": "web-icon",
- "className": "web-icon-light",
+ "className": "web-icon-chevron-left",
"unicode": ""
},
- "mcp": {
+ "light": {
"encodedCode": "\\ea43",
"prefix": "web-icon",
- "className": "web-icon-mcp",
+ "className": "web-icon-light",
"unicode": ""
+ },
+ "mcp": {
+ "encodedCode": "\\ea44",
+ "prefix": "web-icon",
+ "className": "web-icon-mcp",
+ "unicode": ""
}
}
diff --git a/src/icons/output/web-icon.css b/src/icons/output/web-icon.css
index 5ecbd31caa..914702986b 100644
--- a/src/icons/output/web-icon.css
+++ b/src/icons/output/web-icon.css
@@ -41,183 +41,186 @@
.web-icon-vue:before {
content: '\ea07';
}
-.web-icon-chevron-down:before {
+.web-icon-rust:before {
content: '\ea08';
}
-.web-icon-firebase:before {
+.web-icon-chevron-down:before {
content: '\ea09';
}
-.web-icon-github:before {
+.web-icon-firebase:before {
content: '\ea0a';
}
-.web-icon-ticket:before {
+.web-icon-github:before {
content: '\ea0b';
}
-.web-icon-sparkle:before {
+.web-icon-ticket:before {
content: '\ea0c';
}
-.web-icon-divider-vertical:before {
+.web-icon-sparkle:before {
content: '\ea0d';
}
-.web-icon-nuxt:before {
+.web-icon-divider-vertical:before {
content: '\ea0e';
}
-.web-icon-chevron-up:before {
+.web-icon-nuxt:before {
content: '\ea0f';
}
-.web-icon-ycombinator:before {
+.web-icon-chevron-up:before {
content: '\ea10';
}
-.web-icon-x:before {
+.web-icon-ycombinator:before {
content: '\ea11';
}
-.web-icon-textmagic:before {
+.web-icon-x:before {
content: '\ea12';
}
-.web-icon-daily-dev:before {
+.web-icon-textmagic:before {
content: '\ea13';
}
-.web-icon-chevron-right:before {
+.web-icon-daily-dev:before {
content: '\ea14';
}
-.web-icon-instagram:before {
+.web-icon-chevron-right:before {
content: '\ea15';
}
-.web-icon-ext-link:before {
+.web-icon-instagram:before {
content: '\ea16';
}
-.web-icon-arrow-right:before {
+.web-icon-ext-link:before {
content: '\ea17';
}
-.web-icon-edge:before {
+.web-icon-arrow-right:before {
content: '\ea18';
}
-.web-icon-download:before {
+.web-icon-edge:before {
content: '\ea19';
}
-.web-icon-dark:before {
+.web-icon-download:before {
content: '\ea1a';
}
-.web-icon-bluesky:before {
+.web-icon-dark:before {
content: '\ea1b';
}
-.web-icon-plus:before {
+.web-icon-bluesky:before {
content: '\ea1c';
}
-.web-icon-check:before {
+.web-icon-plus:before {
content: '\ea1d';
}
-.web-icon-close:before {
+.web-icon-check:before {
content: '\ea1e';
}
-.web-icon-copy:before {
+.web-icon-close:before {
content: '\ea1f';
}
-.web-icon-message:before {
+.web-icon-copy:before {
content: '\ea20';
}
-.web-icon-play:before {
+.web-icon-message:before {
content: '\ea21';
}
-.web-icon-remix:before {
+.web-icon-play:before {
content: '\ea22';
}
-.web-icon-skills:before {
+.web-icon-remix:before {
content: '\ea23';
}
-.web-icon-hamburger-menu:before {
+.web-icon-skills:before {
content: '\ea24';
}
-.web-icon-google:before {
+.web-icon-hamburger-menu:before {
content: '\ea25';
}
-.web-icon-rest:before {
+.web-icon-google:before {
content: '\ea26';
}
-.web-icon-star:before {
+.web-icon-rest:before {
content: '\ea27';
}
-.web-icon-mailgun:before {
+.web-icon-star:before {
content: '\ea28';
}
-.web-icon-regions:before {
+.web-icon-mailgun:before {
content: '\ea29';
}
-.web-icon-youtube:before {
+.web-icon-regions:before {
content: '\ea2a';
}
-.web-icon-command:before {
+.web-icon-youtube:before {
content: '\ea2b';
}
-.web-icon-logout-right:before {
+.web-icon-command:before {
content: '\ea2c';
}
-.web-icon-tanstack:before {
+.web-icon-logout-right:before {
content: '\ea2d';
}
-.web-icon-location:before {
+.web-icon-tanstack:before {
content: '\ea2e';
}
-.web-icon-arrow-up:before {
+.web-icon-location:before {
content: '\ea2f';
}
-.web-icon-linkedin:before {
+.web-icon-arrow-up:before {
content: '\ea30';
}
-.web-icon-arena:before {
+.web-icon-linkedin:before {
content: '\ea31';
}
-.web-icon-twitter:before {
+.web-icon-arena:before {
content: '\ea32';
}
-.web-icon-customize:before {
+.web-icon-twitter:before {
content: '\ea33';
}
-.web-icon-discord:before {
+.web-icon-customize:before {
content: '\ea34';
}
-.web-icon-calendar:before {
+.web-icon-discord:before {
content: '\ea35';
}
-.web-icon-arrow-left:before {
+.web-icon-calendar:before {
content: '\ea36';
}
-.web-icon-sendgrid:before {
+.web-icon-arrow-left:before {
content: '\ea37';
}
-.web-icon-pop-locations:before {
+.web-icon-sendgrid:before {
content: '\ea38';
}
-.web-icon-product-hunt:before {
+.web-icon-pop-locations:before {
content: '\ea39';
}
-.web-icon-appwrite:before {
+.web-icon-product-hunt:before {
content: '\ea3a';
}
-.web-icon-arrow-ext-link:before {
+.web-icon-appwrite:before {
content: '\ea3b';
}
-.web-icon-logout-left:before {
+.web-icon-arrow-ext-link:before {
content: '\ea3c';
}
-.web-icon-external-icon:before {
+.web-icon-logout-left:before {
content: '\ea3d';
}
-.web-icon-apple:before {
+.web-icon-external-icon:before {
content: '\ea3e';
}
-.web-icon-tiktok:before {
+.web-icon-apple:before {
content: '\ea3f';
}
-.web-icon-minus:before {
+.web-icon-tiktok:before {
content: '\ea40';
}
-.web-icon-chevron-left:before {
+.web-icon-minus:before {
content: '\ea41';
}
-.web-icon-light:before {
+.web-icon-chevron-left:before {
content: '\ea42';
}
-.web-icon-mcp:before {
+.web-icon-light:before {
content: '\ea43';
}
+.web-icon-mcp:before {
+ content: '\ea44';
+}
diff --git a/src/icons/output/web-icon.eot b/src/icons/output/web-icon.eot
index cc7fe4355c..428dc6f998 100644
Binary files a/src/icons/output/web-icon.eot and b/src/icons/output/web-icon.eot differ
diff --git a/src/icons/output/web-icon.scss b/src/icons/output/web-icon.scss
index 8e3eeef38b..0913ae9ad4 100644
--- a/src/icons/output/web-icon.scss
+++ b/src/icons/output/web-icon.scss
@@ -23,66 +23,67 @@
.web-icon-microsoft:before { content: "\ea05"; }
.web-icon-platform:before { content: "\ea06"; }
.web-icon-vue:before { content: "\ea07"; }
-.web-icon-chevron-down:before { content: "\ea08"; }
-.web-icon-firebase:before { content: "\ea09"; }
-.web-icon-github:before { content: "\ea0a"; }
-.web-icon-ticket:before { content: "\ea0b"; }
-.web-icon-sparkle:before { content: "\ea0c"; }
-.web-icon-divider-vertical:before { content: "\ea0d"; }
-.web-icon-nuxt:before { content: "\ea0e"; }
-.web-icon-chevron-up:before { content: "\ea0f"; }
-.web-icon-ycombinator:before { content: "\ea10"; }
-.web-icon-x:before { content: "\ea11"; }
-.web-icon-textmagic:before { content: "\ea12"; }
-.web-icon-daily-dev:before { content: "\ea13"; }
-.web-icon-chevron-right:before { content: "\ea14"; }
-.web-icon-instagram:before { content: "\ea15"; }
-.web-icon-ext-link:before { content: "\ea16"; }
-.web-icon-arrow-right:before { content: "\ea17"; }
-.web-icon-edge:before { content: "\ea18"; }
-.web-icon-download:before { content: "\ea19"; }
-.web-icon-dark:before { content: "\ea1a"; }
-.web-icon-bluesky:before { content: "\ea1b"; }
-.web-icon-plus:before { content: "\ea1c"; }
-.web-icon-check:before { content: "\ea1d"; }
-.web-icon-close:before { content: "\ea1e"; }
-.web-icon-copy:before { content: "\ea1f"; }
-.web-icon-message:before { content: "\ea20"; }
-.web-icon-play:before { content: "\ea21"; }
-.web-icon-remix:before { content: "\ea22"; }
-.web-icon-skills:before { content: "\ea23"; }
-.web-icon-hamburger-menu:before { content: "\ea24"; }
-.web-icon-google:before { content: "\ea25"; }
-.web-icon-rest:before { content: "\ea26"; }
-.web-icon-star:before { content: "\ea27"; }
-.web-icon-mailgun:before { content: "\ea28"; }
-.web-icon-regions:before { content: "\ea29"; }
-.web-icon-youtube:before { content: "\ea2a"; }
-.web-icon-command:before { content: "\ea2b"; }
-.web-icon-logout-right:before { content: "\ea2c"; }
-.web-icon-tanstack:before { content: "\ea2d"; }
-.web-icon-location:before { content: "\ea2e"; }
-.web-icon-arrow-up:before { content: "\ea2f"; }
-.web-icon-linkedin:before { content: "\ea30"; }
-.web-icon-arena:before { content: "\ea31"; }
-.web-icon-twitter:before { content: "\ea32"; }
-.web-icon-customize:before { content: "\ea33"; }
-.web-icon-discord:before { content: "\ea34"; }
-.web-icon-calendar:before { content: "\ea35"; }
-.web-icon-arrow-left:before { content: "\ea36"; }
-.web-icon-sendgrid:before { content: "\ea37"; }
-.web-icon-pop-locations:before { content: "\ea38"; }
-.web-icon-product-hunt:before { content: "\ea39"; }
-.web-icon-appwrite:before { content: "\ea3a"; }
-.web-icon-arrow-ext-link:before { content: "\ea3b"; }
-.web-icon-logout-left:before { content: "\ea3c"; }
-.web-icon-external-icon:before { content: "\ea3d"; }
-.web-icon-apple:before { content: "\ea3e"; }
-.web-icon-tiktok:before { content: "\ea3f"; }
-.web-icon-minus:before { content: "\ea40"; }
-.web-icon-chevron-left:before { content: "\ea41"; }
-.web-icon-light:before { content: "\ea42"; }
-.web-icon-mcp:before { content: "\ea43"; }
+.web-icon-rust:before { content: "\ea08"; }
+.web-icon-chevron-down:before { content: "\ea09"; }
+.web-icon-firebase:before { content: "\ea0a"; }
+.web-icon-github:before { content: "\ea0b"; }
+.web-icon-ticket:before { content: "\ea0c"; }
+.web-icon-sparkle:before { content: "\ea0d"; }
+.web-icon-divider-vertical:before { content: "\ea0e"; }
+.web-icon-nuxt:before { content: "\ea0f"; }
+.web-icon-chevron-up:before { content: "\ea10"; }
+.web-icon-ycombinator:before { content: "\ea11"; }
+.web-icon-x:before { content: "\ea12"; }
+.web-icon-textmagic:before { content: "\ea13"; }
+.web-icon-daily-dev:before { content: "\ea14"; }
+.web-icon-chevron-right:before { content: "\ea15"; }
+.web-icon-instagram:before { content: "\ea16"; }
+.web-icon-ext-link:before { content: "\ea17"; }
+.web-icon-arrow-right:before { content: "\ea18"; }
+.web-icon-edge:before { content: "\ea19"; }
+.web-icon-download:before { content: "\ea1a"; }
+.web-icon-dark:before { content: "\ea1b"; }
+.web-icon-bluesky:before { content: "\ea1c"; }
+.web-icon-plus:before { content: "\ea1d"; }
+.web-icon-check:before { content: "\ea1e"; }
+.web-icon-close:before { content: "\ea1f"; }
+.web-icon-copy:before { content: "\ea20"; }
+.web-icon-message:before { content: "\ea21"; }
+.web-icon-play:before { content: "\ea22"; }
+.web-icon-remix:before { content: "\ea23"; }
+.web-icon-skills:before { content: "\ea24"; }
+.web-icon-hamburger-menu:before { content: "\ea25"; }
+.web-icon-google:before { content: "\ea26"; }
+.web-icon-rest:before { content: "\ea27"; }
+.web-icon-star:before { content: "\ea28"; }
+.web-icon-mailgun:before { content: "\ea29"; }
+.web-icon-regions:before { content: "\ea2a"; }
+.web-icon-youtube:before { content: "\ea2b"; }
+.web-icon-command:before { content: "\ea2c"; }
+.web-icon-logout-right:before { content: "\ea2d"; }
+.web-icon-tanstack:before { content: "\ea2e"; }
+.web-icon-location:before { content: "\ea2f"; }
+.web-icon-arrow-up:before { content: "\ea30"; }
+.web-icon-linkedin:before { content: "\ea31"; }
+.web-icon-arena:before { content: "\ea32"; }
+.web-icon-twitter:before { content: "\ea33"; }
+.web-icon-customize:before { content: "\ea34"; }
+.web-icon-discord:before { content: "\ea35"; }
+.web-icon-calendar:before { content: "\ea36"; }
+.web-icon-arrow-left:before { content: "\ea37"; }
+.web-icon-sendgrid:before { content: "\ea38"; }
+.web-icon-pop-locations:before { content: "\ea39"; }
+.web-icon-product-hunt:before { content: "\ea3a"; }
+.web-icon-appwrite:before { content: "\ea3b"; }
+.web-icon-arrow-ext-link:before { content: "\ea3c"; }
+.web-icon-logout-left:before { content: "\ea3d"; }
+.web-icon-external-icon:before { content: "\ea3e"; }
+.web-icon-apple:before { content: "\ea3f"; }
+.web-icon-tiktok:before { content: "\ea40"; }
+.web-icon-minus:before { content: "\ea41"; }
+.web-icon-chevron-left:before { content: "\ea42"; }
+.web-icon-light:before { content: "\ea43"; }
+.web-icon-mcp:before { content: "\ea44"; }
$web-icon-search: "\ea01";
$web-icon-arrow-down: "\ea02";
@@ -91,63 +92,64 @@ $web-icon-refine: "\ea04";
$web-icon-microsoft: "\ea05";
$web-icon-platform: "\ea06";
$web-icon-vue: "\ea07";
-$web-icon-chevron-down: "\ea08";
-$web-icon-firebase: "\ea09";
-$web-icon-github: "\ea0a";
-$web-icon-ticket: "\ea0b";
-$web-icon-sparkle: "\ea0c";
-$web-icon-divider-vertical: "\ea0d";
-$web-icon-nuxt: "\ea0e";
-$web-icon-chevron-up: "\ea0f";
-$web-icon-ycombinator: "\ea10";
-$web-icon-x: "\ea11";
-$web-icon-textmagic: "\ea12";
-$web-icon-daily-dev: "\ea13";
-$web-icon-chevron-right: "\ea14";
-$web-icon-instagram: "\ea15";
-$web-icon-ext-link: "\ea16";
-$web-icon-arrow-right: "\ea17";
-$web-icon-edge: "\ea18";
-$web-icon-download: "\ea19";
-$web-icon-dark: "\ea1a";
-$web-icon-bluesky: "\ea1b";
-$web-icon-plus: "\ea1c";
-$web-icon-check: "\ea1d";
-$web-icon-close: "\ea1e";
-$web-icon-copy: "\ea1f";
-$web-icon-message: "\ea20";
-$web-icon-play: "\ea21";
-$web-icon-remix: "\ea22";
-$web-icon-skills: "\ea23";
-$web-icon-hamburger-menu: "\ea24";
-$web-icon-google: "\ea25";
-$web-icon-rest: "\ea26";
-$web-icon-star: "\ea27";
-$web-icon-mailgun: "\ea28";
-$web-icon-regions: "\ea29";
-$web-icon-youtube: "\ea2a";
-$web-icon-command: "\ea2b";
-$web-icon-logout-right: "\ea2c";
-$web-icon-tanstack: "\ea2d";
-$web-icon-location: "\ea2e";
-$web-icon-arrow-up: "\ea2f";
-$web-icon-linkedin: "\ea30";
-$web-icon-arena: "\ea31";
-$web-icon-twitter: "\ea32";
-$web-icon-customize: "\ea33";
-$web-icon-discord: "\ea34";
-$web-icon-calendar: "\ea35";
-$web-icon-arrow-left: "\ea36";
-$web-icon-sendgrid: "\ea37";
-$web-icon-pop-locations: "\ea38";
-$web-icon-product-hunt: "\ea39";
-$web-icon-appwrite: "\ea3a";
-$web-icon-arrow-ext-link: "\ea3b";
-$web-icon-logout-left: "\ea3c";
-$web-icon-external-icon: "\ea3d";
-$web-icon-apple: "\ea3e";
-$web-icon-tiktok: "\ea3f";
-$web-icon-minus: "\ea40";
-$web-icon-chevron-left: "\ea41";
-$web-icon-light: "\ea42";
-$web-icon-mcp: "\ea43";
+$web-icon-rust: "\ea08";
+$web-icon-chevron-down: "\ea09";
+$web-icon-firebase: "\ea0a";
+$web-icon-github: "\ea0b";
+$web-icon-ticket: "\ea0c";
+$web-icon-sparkle: "\ea0d";
+$web-icon-divider-vertical: "\ea0e";
+$web-icon-nuxt: "\ea0f";
+$web-icon-chevron-up: "\ea10";
+$web-icon-ycombinator: "\ea11";
+$web-icon-x: "\ea12";
+$web-icon-textmagic: "\ea13";
+$web-icon-daily-dev: "\ea14";
+$web-icon-chevron-right: "\ea15";
+$web-icon-instagram: "\ea16";
+$web-icon-ext-link: "\ea17";
+$web-icon-arrow-right: "\ea18";
+$web-icon-edge: "\ea19";
+$web-icon-download: "\ea1a";
+$web-icon-dark: "\ea1b";
+$web-icon-bluesky: "\ea1c";
+$web-icon-plus: "\ea1d";
+$web-icon-check: "\ea1e";
+$web-icon-close: "\ea1f";
+$web-icon-copy: "\ea20";
+$web-icon-message: "\ea21";
+$web-icon-play: "\ea22";
+$web-icon-remix: "\ea23";
+$web-icon-skills: "\ea24";
+$web-icon-hamburger-menu: "\ea25";
+$web-icon-google: "\ea26";
+$web-icon-rest: "\ea27";
+$web-icon-star: "\ea28";
+$web-icon-mailgun: "\ea29";
+$web-icon-regions: "\ea2a";
+$web-icon-youtube: "\ea2b";
+$web-icon-command: "\ea2c";
+$web-icon-logout-right: "\ea2d";
+$web-icon-tanstack: "\ea2e";
+$web-icon-location: "\ea2f";
+$web-icon-arrow-up: "\ea30";
+$web-icon-linkedin: "\ea31";
+$web-icon-arena: "\ea32";
+$web-icon-twitter: "\ea33";
+$web-icon-customize: "\ea34";
+$web-icon-discord: "\ea35";
+$web-icon-calendar: "\ea36";
+$web-icon-arrow-left: "\ea37";
+$web-icon-sendgrid: "\ea38";
+$web-icon-pop-locations: "\ea39";
+$web-icon-product-hunt: "\ea3a";
+$web-icon-appwrite: "\ea3b";
+$web-icon-arrow-ext-link: "\ea3c";
+$web-icon-logout-left: "\ea3d";
+$web-icon-external-icon: "\ea3e";
+$web-icon-apple: "\ea3f";
+$web-icon-tiktok: "\ea40";
+$web-icon-minus: "\ea41";
+$web-icon-chevron-left: "\ea42";
+$web-icon-light: "\ea43";
+$web-icon-mcp: "\ea44";
diff --git a/src/icons/output/web-icon.svg b/src/icons/output/web-icon.svg
index b896fa4515..d8dd9ef6d6 100644
--- a/src/icons/output/web-icon.svg
+++ b/src/icons/output/web-icon.svg
@@ -28,185 +28,188 @@
-
+
diff --git a/src/icons/output/web-icon.symbol.svg b/src/icons/output/web-icon.symbol.svg
index f8db3f3aa7..88d28b1b88 100644
--- a/src/icons/output/web-icon.symbol.svg
+++ b/src/icons/output/web-icon.symbol.svg
@@ -3,4 +3,4 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/icons/output/web-icon.ttf b/src/icons/output/web-icon.ttf
index b08109fe00..f2ae1b364d 100644
Binary files a/src/icons/output/web-icon.ttf and b/src/icons/output/web-icon.ttf differ
diff --git a/src/icons/output/web-icon.woff b/src/icons/output/web-icon.woff
index dd1fb629d8..b82ea54832 100644
Binary files a/src/icons/output/web-icon.woff and b/src/icons/output/web-icon.woff differ
diff --git a/src/icons/output/web-icon.woff2 b/src/icons/output/web-icon.woff2
index b8d37b9248..96501b8097 100644
Binary files a/src/icons/output/web-icon.woff2 and b/src/icons/output/web-icon.woff2 differ
diff --git a/src/icons/svg/rust.svg b/src/icons/svg/rust.svg
new file mode 100644
index 0000000000..1cf4dafe68
--- /dev/null
+++ b/src/icons/svg/rust.svg
@@ -0,0 +1 @@
+
diff --git a/src/lib/components/ui/icon/sprite/sprite.svelte b/src/lib/components/ui/icon/sprite/sprite.svelte
index fd69fc81bd..b5628b191e 100644
--- a/src/lib/components/ui/icon/sprite/sprite.svelte
+++ b/src/lib/components/ui/icon/sprite/sprite.svelte
@@ -57,6 +57,14 @@
fill="currentColor"
>
+
+
+
= {
[Platform.ServerGraphql]: 'graphql',
[Platform.ServerRest]: 'http',
[Platform.ServerGo]: 'go',
+ [Platform.ServerRust]: 'rust',
vue: 'html',
svelte: 'html'
};
diff --git a/src/lib/utils/references.ts b/src/lib/utils/references.ts
index be37059f1f..3a4fe4f3fd 100644
--- a/src/lib/utils/references.ts
+++ b/src/lib/utils/references.ts
@@ -61,6 +61,7 @@ export const Platform = {
ServerGo: 'server-go',
ServerSwift: 'server-swift',
ServerKotlin: 'server-kotlin',
+ ServerRust: 'server-rust',
ServerJava: 'server-java',
ServerGraphql: 'server-graphql',
ServerRest: 'server-rest'
@@ -100,6 +101,7 @@ export const platformMap: Record = {
[Platform.ServerJava]: 'Java',
[Platform.ServerGraphql]: 'GraphQL',
[Platform.ServerRest]: 'REST',
+ [Platform.ServerRust]: 'Rust',
[Platform.ServerGo]: 'Go',
sh: 'Shell',
js: 'JavaScript',
@@ -138,6 +140,7 @@ export const platformMap: Record = {
svelte: 'Svelte',
groovy: 'Groovy',
go: 'Go',
+ rust: 'Rust',
dockerfile: 'Dockerfile',
docker: 'Dockerfile',
ini: 'INI',
diff --git a/src/routes/(marketing)/(assets)/icons/light/rust.svg b/src/routes/(marketing)/(assets)/icons/light/rust.svg
new file mode 100644
index 0000000000..9367109a2e
--- /dev/null
+++ b/src/routes/(marketing)/(assets)/icons/light/rust.svg
@@ -0,0 +1 @@
+
diff --git a/src/routes/(marketing)/(assets)/icons/rust.svg b/src/routes/(marketing)/(assets)/icons/rust.svg
new file mode 100644
index 0000000000..eb2b2d28a7
--- /dev/null
+++ b/src/routes/(marketing)/(assets)/icons/rust.svg
@@ -0,0 +1 @@
+
diff --git a/src/routes/(marketing)/(components)/platforms.svelte b/src/routes/(marketing)/(components)/platforms.svelte
index 5913dad655..70d7f6814e 100644
--- a/src/routes/(marketing)/(components)/platforms.svelte
+++ b/src/routes/(marketing)/(components)/platforms.svelte
@@ -25,6 +25,8 @@
import ReactNative from '../(assets)/icons/react-native.svg';
import TanStack from '../(assets)/icons/tanstack.svg';
import TanStackLight from '../(assets)/icons/light/tanstack.svg';
+ import Rust from '../(assets)/icons/rust.svg';
+ import RustLight from '../(assets)/icons/light/rust.svg';
import GradientText from '$lib/components/fancy/gradient-text.svelte';
import Noise from '$lib/components/fancy/noise.svelte';
import { Tooltip } from 'bits-ui';
@@ -115,6 +117,13 @@
href: '/docs/quick-starts/dart',
primary: '#01579B',
secondary: '#29B6F6'
+ },
+ {
+ name: 'Rust',
+ dark: Rust,
+ light: RustLight,
+ href: '/docs/quick-starts/rust',
+ primary: '#CE422B'
}
];
diff --git a/src/routes/blog/post/announcing-appwrite-rust-sdk/+page.markdoc b/src/routes/blog/post/announcing-appwrite-rust-sdk/+page.markdoc
new file mode 100644
index 0000000000..9da32d09ff
--- /dev/null
+++ b/src/routes/blog/post/announcing-appwrite-rust-sdk/+page.markdoc
@@ -0,0 +1,118 @@
+---
+layout: post
+title: "Introducing the Appwrite Rust SDK"
+description: Appwrite now has an official Rust SDK, bringing type-safe, async-first Appwrite integration to the Rust ecosystem.
+date: 2026-04-08
+cover: /images/blog/announcing-appwrite-rust-sdk/cover.png
+timeToRead: 4
+author: chirag-aggarwal
+category: announcement
+featured: false
+---
+
+Appwrite now supports Rust as an official server SDK. The SDK provides async, type-safe access to all Appwrite server-side APIs and is available on [crates.io](https://crates.io/crates/appwrite).
+
+# Why Rust
+
+Rust is one of the fastest-growing languages in backend development. Memory safety without garbage collection, zero-cost abstractions, and built-in concurrency make it well-suited for backend services, CLI tools, and infrastructure. With the Rust SDK, developers no longer need to use raw HTTP calls to integrate Appwrite into Rust applications.
+
+The SDK follows the same conventions as existing Appwrite server SDKs for Node.js, Python, and Go, with an idiomatic Rust API surface.
+
+# What's included
+
+The SDK supports every Appwrite server-side service:
+
+| Service | What you can do |
+|---------|----------------|
+| **TablesDB** | Create databases, tables, columns, rows. Query with filters, sorting, and pagination. |
+| **Account** | Manage sessions, OAuth, MFA, and user preferences. |
+| **Users** | Manage users, targets, and labels. |
+| **Teams** | Manage teams, memberships, and invites. |
+| **Storage** | Create buckets, upload and download files. |
+| **Tokens** | Create and manage file tokens for secure file access. |
+| **Functions** | Create, deploy, and manage serverless functions. |
+| **Messaging** | Send emails, SMS, and push notifications through providers like Twilio, Sendgrid, and more. |
+| **Sites** | Create, deploy, and manage web applications. |
+| **Locale** | Get user locale, list languages, currencies, countries, and continent information. |
+| **Avatars** | Generate user initials, QR codes, country flags, browser icons, favicons, and webpage screenshots. |
+
+The SDK also includes utility modules for building queries, generating IDs, constructing permissions, and working with operators for atomic database updates.
+
+# Getting started
+
+## Step 1: Set up Appwrite
+
+Set up an Appwrite project by [creating an Appwrite Cloud account](https://cloud.appwrite.io) or [self-hosting Appwrite](/docs/advanced/self-hosting).
+
+## Step 2: Install the Rust SDK
+
+Add the SDK and its dependencies to your project:
+
+```sh
+cargo add appwrite
+cargo add tokio -F full
+cargo add serde_json
+```
+
+## Step 3: Start building
+
+Initialize the client and make API calls:
+
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::id::ID;
+use appwrite::query::Query;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://fra.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ // Create a database and table
+ let db = tables_db.create(ID::unique(), "MyDB", None).await?;
+ let table = tables_db.create_table(
+ &db.id, ID::unique(), "Tasks",
+ None, None, None, None, None,
+ ).await?;
+
+ // Create a row
+ tables_db.create_row(
+ &db.id, &table.id, ID::unique(),
+ json!({"title": "Ship Rust SDK", "status": "done"}),
+ None, None,
+ ).await?;
+
+ // Query rows
+ let tasks = tables_db.list_rows(
+ &db.id, &table.id,
+ Some(vec![
+ Query::equal("status", "done").to_string(),
+ Query::order_desc("$createdAt").to_string(),
+ ]),
+ None, None, None,
+ ).await?;
+
+ println!("Found {} tasks", tasks.total);
+ Ok(())
+}
+```
+
+All service methods are async, return a typed `Result`, and use positional parameters with `Option` for optional fields. The SDK handles authentication headers, request serialization, and error parsing automatically.
+
+## Step 4: Explore the documentation
+
+Follow the [Rust quick start guide](/docs/quick-starts/rust) for a step-by-step walkthrough. You can also use the [AI quickstart prompt](/docs/tooling/ai/quickstart-prompts/rust) with tools like Cursor, Claude Code, or Windsurf to set up a project with AI assistance. Rust examples are available across all server SDK documentation pages.
+
+# Resources
+
+- [Rust quick start](/docs/quick-starts/rust)
+- [SDK on crates.io](https://crates.io/crates/appwrite)
+- [SDK repository on GitHub](https://github.com/appwrite/sdk-for-rust)
+- [SDKs documentation](/docs/sdks)
+- [Discord](https://appwrite.io/discord)
diff --git a/src/routes/changelog/(entries)/2026-04-08-1.markdoc b/src/routes/changelog/(entries)/2026-04-08-1.markdoc
new file mode 100644
index 0000000000..663ade6d9e
--- /dev/null
+++ b/src/routes/changelog/(entries)/2026-04-08-1.markdoc
@@ -0,0 +1,12 @@
+---
+layout: changelog
+title: "Introducing the Appwrite Rust SDK"
+date: 2026-04-08
+cover: /images/blog/announcing-appwrite-rust-sdk/cover.png
+---
+
+Appwrite now supports Rust as an official server SDK. The SDK provides async, type-safe access to all Appwrite server-side APIs, including Databases, Auth, Storage, Functions, and Messaging. It is available on [crates.io](https://crates.io/crates/appwrite).
+
+{% arrow_link href="/blog/post/announcing-appwrite-rust-sdk" %}
+Read the announcement
+{% /arrow_link %}
diff --git a/src/routes/docs/advanced/platform/api-keys/+page.markdoc b/src/routes/docs/advanced/platform/api-keys/+page.markdoc
index 8810f1d424..5faf72dbd4 100644
--- a/src/routes/docs/advanced/platform/api-keys/+page.markdoc
+++ b/src/routes/docs/advanced/platform/api-keys/+page.markdoc
@@ -137,6 +137,15 @@ Client client = new Client()
.setProject("")
.setKey(""); // Your API key
```
+
+```server-rust
+use appwrite::Client;
+
+let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key(""); // Your API key
+```
{% /multicode %}
When adding a new API Key, you can choose which [scopes](#scopes) to grant your application.
diff --git a/src/routes/docs/products/auth/custom-token/+page.markdoc b/src/routes/docs/products/auth/custom-token/+page.markdoc
index 472024b173..9ff8a435a8 100644
--- a/src/routes/docs/products/auth/custom-token/+page.markdoc
+++ b/src/routes/docs/products/auth/custom-token/+page.markdoc
@@ -150,6 +150,31 @@ var users = new Users(client);
var token = await users.CreateToken("");
var secret = token.secret;
```
+
+```server-rust
+use appwrite::Client;
+use appwrite::services::users::Users;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key(""); // Your project API key
+
+ let users = Users::new(&client);
+
+ let token = users.create_token(
+ "",
+ None, // length (optional)
+ None, // expire (optional)
+ ).await?;
+
+ let secret = token.secret;
+ println!("{}", secret);
+ Ok(())
+}
+```
{% /multicode %}
The newly created token includes a `secret` which is 6 character long hexadecimal string. You can configure length of the secret and expiry when creating a token.
diff --git a/src/routes/docs/products/auth/impersonation/+page.markdoc b/src/routes/docs/products/auth/impersonation/+page.markdoc
index 11bb76baae..433945c140 100644
--- a/src/routes/docs/products/auth/impersonation/+page.markdoc
+++ b/src/routes/docs/products/auth/impersonation/+page.markdoc
@@ -212,6 +212,29 @@ users.updateImpersonator(
})
);
```
+
+```server-rust
+use appwrite::Client;
+use appwrite::services::users::Users;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key(""); // Your secret API key
+
+ let users = Users::new(&client);
+
+ let result = users.update_impersonator(
+ "",
+ true,
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
{% /multicode %}
Only grant this capability to internal users (support agents, QA engineers, or operations staff) who need to see the app exactly as a specific end user would.
diff --git a/src/routes/docs/products/auth/labels/+page.markdoc b/src/routes/docs/products/auth/labels/+page.markdoc
index 3232ae3312..1a209b272a 100644
--- a/src/routes/docs/products/auth/labels/+page.markdoc
+++ b/src/routes/docs/products/auth/labels/+page.markdoc
@@ -172,6 +172,29 @@ var response = await users.UpdateLabels(
labels: [ 'subscriber' ]
);
```
+
+```server-rust
+use appwrite::Client;
+use appwrite::services::users::Users;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key("98fd4...a2ad2"); // Your secret API key
+
+ let users = Users::new(&client);
+
+ let response = users.update_labels(
+ "",
+ vec!["subscriber"],
+ ).await?;
+
+ println!("{:?}", response);
+ Ok(())
+}
+```
{% /multicode %}
This would correspond with the permissions below.
diff --git a/src/routes/docs/products/auth/server-side-rendering/+page.markdoc b/src/routes/docs/products/auth/server-side-rendering/+page.markdoc
index c203375989..e73c9560f6 100644
--- a/src/routes/docs/products/auth/server-side-rendering/+page.markdoc
+++ b/src/routes/docs/products/auth/server-side-rendering/+page.markdoc
@@ -83,6 +83,14 @@ admin_client = (Client()
)
+```
+```rust
+use appwrite::Client;
+
+let admin_client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key(""); // Your secret API key
```
{% /multicode %}
@@ -133,6 +141,18 @@ session = request.cookies.get('a_session_')
if session:
session_client.set_session(session)
+```
+```rust
+use appwrite::Client;
+
+let session_client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project(""); // Your project ID
+
+let session = req.cookie("a_session_"); // Get the session cookie from the request
+if let Some(session) = session {
+ session_client.set_session(session);
+}
```
{% /multicode %}
@@ -243,6 +263,32 @@ def login():
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 400
```
+```rust
+use appwrite::Client;
+use appwrite::services::account::Account;
+
+// Initialize admin client here
+// ...
+
+async fn login(admin_client: &Client, email: &str, password: &str) -> Result<(), Box> {
+ let account = Account::new(admin_client);
+
+ // Create the session using the Appwrite client
+ let session = account.create_email_password_session(
+ email,
+ password,
+ ).await?;
+
+ // Set the session cookie using the session secret
+ // Use your framework's cookie API to set:
+ // name: "a_session_"
+ // value: session.secret
+ // httpOnly: true, secure: true, sameSite: strict
+ // expires: session.expire
+
+ Ok(())
+}
+```
{% /multicode %}
We also recommend using the `httpOnly`, `secure`, and `sameSite` cookie options to ensure that the cookie is only sent over HTTPS,
@@ -331,6 +377,31 @@ def get_user():
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 400
+```
+```rust
+use appwrite::Client;
+use appwrite::services::account::Account;
+
+// Initialize the session client here
+
+// First, read the session cookie from the request
+// This depends on your HTTP framework (e.g. actix-web, axum, rocket)
+let session = req.cookie("a_session_");
+
+// If the session cookie is not present, return an error
+if session.is_none() {
+ // return 401 Unauthorized
+}
+
+// Pass the session cookie to the Appwrite client
+let session_client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("");
+session_client.set_session(session.unwrap());
+
+// Now, you can make authenticated requests to the Appwrite API
+let account = Account::new(&session_client);
+let user = account.get().await?;
```
{% /multicode %}
@@ -421,6 +492,18 @@ account = Account(client)
result = account.create_anonymous_session()
```
+```rust
+use appwrite::Client;
+use appwrite::services::account::Account;
+
+let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project(""); // Your project ID
+
+let account = Account::new(&client);
+
+let result = account.create_anonymous_session().await?;
+```
{% /multicode %}
# Forwarding user agent {% #forwarding-user-agent %}
@@ -438,6 +521,11 @@ $client->setForwardedUserAgent($_SERVER['HTTP_USER_AGENT']);
```python
client.set_forwarded_user_agent(request.headers.get('user-agent'))
```
+```rust
+// This depends on your HTTP framework (e.g. actix-web, axum, rocket)
+let user_agent = req.header("user-agent");
+client.add_header("x-forwarded-user-agent", user_agent);
+```
{% /multicode %}
# OAuth2 {% #oauth2 %}
@@ -511,6 +599,27 @@ def oauth():
return redirect(redirect_url)
```
+```rust
+use appwrite::Client;
+use appwrite::services::account::Account;
+use appwrite::enums::OAuthProvider;
+
+let admin_client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+let account = Account::new(&admin_client);
+
+let redirect_url = account.create_o_auth2_token(
+ OAuthProvider::Github, // Provider
+ Some("https://example.com/oauth/success"), // Success URL
+ Some("https://example.com/oauth/failure"), // Failure URL
+ None, // Scopes
+).await?;
+
+// Redirect the user to redirect_url
+```
{% /multicode %}
Next, create a success callback endpoint that receives the `userId` and `secret` URL parameters, and then calls `createSession` on the server side. This endpoint returns a session object, which you can store in a cookie.
@@ -611,6 +720,35 @@ def oauth_success():
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 400
```
+```rust
+use appwrite::Client;
+use appwrite::services::account::Account;
+
+let admin_client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key(""); // Your secret API key
+
+let account = Account::new(&admin_client);
+
+// Get the userId and secret from the URL parameters
+// This depends on your HTTP framework (e.g. actix-web, axum, rocket)
+let user_id = req.query("userId");
+let secret = req.query("secret");
+
+// Create the session using the Appwrite client
+let session = account.create_session(
+ &user_id,
+ &secret,
+).await?;
+
+// Set the session cookie using the session secret
+// Use your framework's cookie API to set:
+// name: "a_session_"
+// value: session.secret
+// httpOnly: true, secure: true, sameSite: strict
+// expires: session.expire
+```
{% /multicode %}
Now the cookie is set, it will be passed to the server with subsequent requests, and you can use it to make authenticated requests to the Appwrite API on behalf of the end-user.
diff --git a/src/routes/docs/products/auth/team-invites/+page.markdoc b/src/routes/docs/products/auth/team-invites/+page.markdoc
index 0da801e4c8..c16614d1f3 100644
--- a/src/routes/docs/products/auth/team-invites/+page.markdoc
+++ b/src/routes/docs/products/auth/team-invites/+page.markdoc
@@ -256,6 +256,34 @@ val response = teams.createMembership(
name = "John Doe" // optional
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::teams::Teams;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let teams = Teams::new(&client);
+
+ // Create membership directly with userId
+ let membership = teams.create_membership(
+ "", // teamId
+ vec!["developer"], // roles
+ None, // email (optional)
+ Some(""), // userId (optional)
+ None, // phone (optional)
+ None, // url (optional)
+ Some("John Doe"), // name (optional)
+ ).await?;
+
+ println!("{:?}", membership);
+ Ok(())
+}
+```
{% /multicode %}
# Manage memberships
@@ -499,6 +527,46 @@ teamsList.teams.forEach { team ->
}
}
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::teams::Teams;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let teams = Teams::new(&client);
+
+ // Get all teams
+ let teams_list = teams.list(
+ None, // queries (optional)
+ None, // search (optional)
+ None, // total (optional)
+ ).await?;
+
+ // Iterate through teams to find memberships
+ for team in &teams_list.teams {
+ let response = teams.list_memberships(
+ &team.id, // teamId
+ None, // queries (optional)
+ None, // search (optional)
+ None, // total (optional)
+ ).await?;
+
+ // Find membership for specific user
+ if let Some(membership) = response.memberships.iter().find(|m| m.user_id == "") {
+ println!("Team: {}", team.name);
+ println!("Joined: {:?}", membership.joined); // None if invited, timestamp if joined
+ println!("Roles: {:?}", membership.roles);
+ }
+ }
+
+ Ok(())
+}
+```
{% /multicode %}
## Remove members
diff --git a/src/routes/docs/products/databases/atomic-numeric-operations/+page.markdoc b/src/routes/docs/products/databases/atomic-numeric-operations/+page.markdoc
index 1333dc0e26..7ff801c48e 100644
--- a/src/routes/docs/products/databases/atomic-numeric-operations/+page.markdoc
+++ b/src/routes/docs/products/databases/atomic-numeric-operations/+page.markdoc
@@ -144,6 +144,27 @@ result = tablesDB.increment_row_column(
value = 1 # value
)
```
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+
+let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+let tables_db = TablesDB::new(&client);
+
+let result = tables_db.increment_row_column(
+ "",
+ "",
+ "",
+ "likes", // column
+ Some(1.0), // value
+ None, // max
+ None, // transaction_id
+).await?;
+```
```graphql
mutation {
databasesIncrementRowColumn(
@@ -277,6 +298,27 @@ result = tablesDB.decrement_row_column(
value = 5 # value
)
```
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+
+let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+let tables_db = TablesDB::new(&client);
+
+let result = tables_db.decrement_row_column(
+ "",
+ "",
+ "",
+ "credits", // column
+ Some(5.0), // value
+ None, // min
+ None, // transaction_id
+).await?;
+```
```graphql
mutation {
databasesDecrementRowColumn(
@@ -431,6 +473,29 @@ result2 = tablesDB.decrement_row_column(
min = 0 # min (optional)
)
```
+```rust
+// Increment with maximum constraint
+let result = tables_db.increment_row_column(
+ "",
+ "",
+ "",
+ "credits", // column
+ Some(100.0), // value
+ Some(1000.0), // max (optional)
+ None, // transaction_id
+).await?;
+
+// Decrement with minimum constraint
+let result2 = tables_db.decrement_row_column(
+ "",
+ "",
+ "",
+ "credits", // column
+ Some(50.0), // value
+ Some(0.0), // min (optional)
+ None, // transaction_id
+).await?;
+```
{% /multicode %}
# Follow best practices {% #follow-best-practices %}
@@ -570,6 +635,33 @@ update_result = tablesDB.update_row(
}
)
```
+```rust
+use serde_json::json;
+
+// First, increment the likes atomically
+let like_result = tables_db.increment_row_column(
+ "",
+ "",
+ "",
+ "likes", // column
+ Some(1.0), // value
+ None, // max
+ None, // transaction_id
+).await?;
+
+// Then, update other fields
+let update_result = tables_db.update_row(
+ "",
+ "",
+ "",
+ Some(json!({
+ "lastLikedBy": user_id,
+ "lastLikedAt": chrono::Utc::now().to_rfc3339()
+ })),
+ None, // permissions
+ None, // transaction_id
+).await?;
+```
{% /multicode %}
# Use transactions {% #use-transactions %}
@@ -675,6 +767,17 @@ tablesDB.increment_row_column(
transaction_id = ''
)
```
+```rust
+tables_db.increment_row_column(
+ "",
+ "",
+ "",
+ "likes",
+ Some(1.0),
+ None, // max
+ Some(""), // transaction_id
+).await?;
+```
```server-php
$tablesDB->incrementRowColumn(
databaseId: '',
diff --git a/src/routes/docs/products/databases/bulk-operations/+page.markdoc b/src/routes/docs/products/databases/bulk-operations/+page.markdoc
index 2b04fa59d4..07a93db88c 100644
--- a/src/routes/docs/products/databases/bulk-operations/+page.markdoc
+++ b/src/routes/docs/products/databases/bulk-operations/+page.markdoc
@@ -98,6 +98,41 @@ result = tablesDB.create_rows(
]
)
```
+
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::id::ID;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.create_rows(
+ "",
+ "",
+ vec![
+ json!({
+ "$id": ID::unique(),
+ "name": "Row 1"
+ }),
+ json!({
+ "$id": ID::unique(),
+ "name": "Row 2"
+ }),
+ ],
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
# Update rows {% #update-rows %}
@@ -154,6 +189,37 @@ result = tablesDB.update_rows(
]
)
```
+
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::query::Query;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.update_rows(
+ "",
+ "",
+ Some(json!({
+ "status": "published"
+ })),
+ Some(vec![
+ Query::equal("status", "draft").to_string(),
+ ]),
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
# Upsert rows {% #upsert-rows %}
@@ -219,6 +285,41 @@ result = tablesDB.upsert_rows(
]
)
```
+
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::id::ID;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.upsert_rows(
+ "",
+ "",
+ vec![
+ json!({
+ "$id": ID::unique(),
+ "name": "New Row 1"
+ }),
+ json!({
+ "$id": "row-id-2", // Existing row ID
+ "name": "New Row 2"
+ }),
+ ],
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
# Delete rows {% #delete-rows %}
@@ -270,6 +371,33 @@ result = tablesDB.delete_rows(
]
)
```
+
+```rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::query::Query;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.delete_rows(
+ "",
+ "",
+ Some(vec![
+ Query::equal("status", "archived").to_string(),
+ ]),
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
{% info title="Queries for deletion" %}
@@ -418,4 +546,21 @@ tablesDB.createRows(
})
);
```
+```rust
+let result = tables_db.create_rows(
+ "",
+ "",
+ vec![
+ json!({
+ "$id": ID::unique(),
+ "name": "One"
+ }),
+ json!({
+ "$id": ID::unique(),
+ "name": "Two"
+ }),
+ ],
+ Some(""),
+).await?;
+```
{% /multicode %}
diff --git a/src/routes/docs/products/databases/databases/+page.markdoc b/src/routes/docs/products/databases/databases/+page.markdoc
index ef98f07201..cc3147838b 100644
--- a/src/routes/docs/products/databases/databases/+page.markdoc
+++ b/src/routes/docs/products/databases/databases/+page.markdoc
@@ -217,4 +217,28 @@ let response = try await tablesDB.create(
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
+
+ let databases = Databases::new(&client);
+
+ let response = databases.create(
+ "",
+ "",
+ None, // enabled (optional)
+ ).await?;
+
+ println!("{:?}", response);
+ Ok(())
+}
+```
+
{% /multicode %}
diff --git a/src/routes/docs/products/databases/legacy/atomic-numeric-operations/+page.markdoc b/src/routes/docs/products/databases/legacy/atomic-numeric-operations/+page.markdoc
index 961743326e..ba0059935c 100644
--- a/src/routes/docs/products/databases/legacy/atomic-numeric-operations/+page.markdoc
+++ b/src/routes/docs/products/databases/legacy/atomic-numeric-operations/+page.markdoc
@@ -144,6 +144,33 @@ result = databases.increment_document_column(
value = 1 # value
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.increment_document_attribute(
+ "",
+ "",
+ "",
+ "likes", // attribute
+ Some(1.0), // value
+ None, // max (optional)
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
```graphql
mutation {
databasesIncrementDocumentColumn(
@@ -277,6 +304,33 @@ result = databases.decrement_document_column(
value = 5 # value
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.decrement_document_attribute(
+ "",
+ "",
+ "",
+ "credits", // attribute
+ Some(5.0), // value
+ None, // min (optional)
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
```graphql
mutation {
databasesDecrementDocumentColumn(
@@ -431,6 +485,46 @@ result2 = databases.decrement_document_column(
min = 0 # min (optional)
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ // Increment with maximum constraint
+ let result = databases.increment_document_attribute(
+ "",
+ "",
+ "",
+ "credits", // attribute
+ Some(100.0), // value
+ Some(1000.0), // max (optional)
+ None, // transaction_id (optional)
+ ).await?;
+
+ // Decrement with minimum constraint
+ let result2 = databases.decrement_document_attribute(
+ "",
+ "",
+ "",
+ "credits", // attribute
+ Some(50.0), // value
+ Some(0.0), // min (optional)
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ println!("{:?}", result2);
+ Ok(())
+}
+```
{% /multicode %}
# Follow best practices {% #follow-best-practices %}
@@ -570,6 +664,49 @@ update_result = databases.update_document(
}
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ // First, increment the likes atomically
+ let like_result = databases.increment_document_attribute(
+ "",
+ "",
+ "",
+ "likes", // attribute
+ Some(1.0), // value
+ None, // max (optional)
+ None, // transaction_id (optional)
+ ).await?;
+
+ // Then, update other fields
+ let update_result = databases.update_document(
+ "",
+ "",
+ "",
+ Some(json!({
+ "lastLikedBy": "",
+ "lastLikedAt": ""
+ })),
+ None, // permissions (optional)
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", like_result);
+ println!("{:?}", update_result);
+ Ok(())
+}
+```
{% /multicode %}
## Explore related features
diff --git a/src/routes/docs/products/databases/legacy/bulk-operations/+page.markdoc b/src/routes/docs/products/databases/legacy/bulk-operations/+page.markdoc
index 496f433a5f..80f666a41a 100644
--- a/src/routes/docs/products/databases/legacy/bulk-operations/+page.markdoc
+++ b/src/routes/docs/products/databases/legacy/bulk-operations/+page.markdoc
@@ -98,6 +98,41 @@ result = databases.create_documents(
]
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use appwrite::id::ID;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.create_documents(
+ "",
+ "",
+ vec![
+ json!({
+ "$id": ID::unique(),
+ "name": "Document 1"
+ }),
+ json!({
+ "$id": ID::unique(),
+ "name": "Document 2"
+ }),
+ ],
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
{% /multicode %}
# Update documents {% #update-documents %}
@@ -155,6 +190,37 @@ result = databases.update_documents(
]
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use appwrite::query::Query;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.update_documents(
+ "",
+ "",
+ Some(json!({
+ "status": "published"
+ })),
+ Some(vec![
+ Query::equal("status", "draft").to_string()
+ ]),
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
{% /multicode %}
# Upsert documents {% #upsert-documents %}
@@ -220,6 +286,41 @@ result = databases.upsert_documents(
]
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use appwrite::id::ID;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.upsert_documents(
+ "",
+ "",
+ vec![
+ json!({
+ "$id": ID::unique(),
+ "name": "New Document 1"
+ }),
+ json!({
+ "$id": "document-id-2",
+ "name": "New Document 2"
+ }),
+ ],
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
{% /multicode %}
# Delete documents {% #delete-documents %}
@@ -271,6 +372,33 @@ result = databases.delete_documents(
]
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use appwrite::query::Query;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.delete_documents(
+ "",
+ "",
+ Some(vec![
+ Query::equal("status", "archived").to_string()
+ ]),
+ None, // transaction_id (optional)
+ ).await?;
+
+ println!("{:?}", result);
+ Ok(())
+}
+```
{% /multicode %}
{% info title="Queries for deletion" %}
diff --git a/src/routes/docs/products/databases/legacy/collections/+page.markdoc b/src/routes/docs/products/databases/legacy/collections/+page.markdoc
index 0569f20b47..11bb32ee43 100644
--- a/src/routes/docs/products/databases/legacy/collections/+page.markdoc
+++ b/src/routes/docs/products/databases/legacy/collections/+page.markdoc
@@ -228,6 +228,34 @@ let collection = try await databases.createCollection(
name: "[NAME]"
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
+
+ let databases = Databases::new(&client);
+
+ let collection = databases.create_collection(
+ "",
+ "",
+ "[NAME]",
+ None, // permissions
+ None, // document_security
+ None, // enabled
+ None, // attributes
+ None, // indexes
+ ).await?;
+
+ println!("{:?}", collection);
+ Ok(())
+}
+```
{% /multicode %}
You can also configure **permissions** in the `createCollection` method, learn more about the `createCollection` in the [API references](/docs/references).
diff --git a/src/routes/docs/products/databases/legacy/databases/+page.markdoc b/src/routes/docs/products/databases/legacy/databases/+page.markdoc
index 9acf8323be..084d49064b 100644
--- a/src/routes/docs/products/databases/legacy/databases/+page.markdoc
+++ b/src/routes/docs/products/databases/legacy/databases/+page.markdoc
@@ -210,5 +210,28 @@ let response = try await databases.create(
name: ""
)
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .set_project("") // Your project ID
+ .set_key("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
+
+ let databases = Databases::new(&client);
+
+ let response = databases.create(
+ "",
+ "",
+ None, // enabled
+ ).await?;
+
+ println!("{:?}", response);
+ Ok(())
+}
+```
{% /multicode %}
diff --git a/src/routes/docs/products/databases/legacy/queries/+page.markdoc b/src/routes/docs/products/databases/legacy/queries/+page.markdoc
index 89e37df7c8..6a72e6de3e 100644
--- a/src/routes/docs/products/databases/legacy/queries/+page.markdoc
+++ b/src/routes/docs/products/databases/legacy/queries/+page.markdoc
@@ -218,6 +218,38 @@ GET /v1/databases//collections//documents?queries[]=
Content-Type: application/json
X-Appwrite-Project:
```
+```rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use appwrite::query::Query;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let databases = Databases::new(&client);
+
+ let result = databases.list_documents(
+ "",
+ "",
+ Some(vec![
+ Query::equal("title", json!(["Avatar", "Lord of the Rings"])).to_string(),
+ Query::greater_than("year", 1999).to_string(),
+ ]),
+ None,
+ None,
+ None,
+ ).await?;
+
+ println!("{:?}", result);
+
+ Ok(())
+}
+```
{% /multicode %}
# Query operators {% #query-operators %}
@@ -251,6 +283,9 @@ Query.select(["name", "title"])
```http
{"method":"select","values":["name","title"]}
```
+```rust
+Query::select(vec!["name", "title"])
+```
{% /multicode %}
### Select relationship data {% #relationship-select %}
@@ -312,6 +347,17 @@ GET /v1/databases//collections//documents/
```
+```rust
+let doc = databases.get_document(
+ "",
+ "",
+ "",
+ Some(vec![
+ Query::select(vec!["name", "age"]).to_string(),
+ ]),
+ None,
+).await?;
+```
{% /multicode %}
#### Load all relationship data
@@ -370,6 +416,17 @@ Content-Type: application/json
X-Appwrite-Project:
{"method":"select","values":["*","reviews.*"]}
```
+```rust
+let doc = databases.get_document(
+ "",
+ "",
+ "",
+ Some(vec![
+ Query::select(vec!["*", "reviews.*"]).to_string(),
+ ]),
+ None,
+).await?;
+```
{% /multicode %}
#### Select specific relationship fields
@@ -427,6 +484,17 @@ let doc = try await databases.getDocument(
# Load specific fields from main and related documents
{"method":"select","values":["name","age","reviews.author","reviews.rating"]}
```
+```rust
+let doc = databases.get_document(
+ "",
+ "",
+ "",
+ Some(vec![
+ Query::select(vec!["name", "age", "reviews.author", "reviews.rating"]).to_string(),
+ ]),
+ None,
+).await?;
+```
{% /multicode %}
#### Load nested relationships
@@ -457,6 +525,9 @@ Query.select(["*", "reviews.*", "reviews.author.*"])
```http
{"method":"select","values":["*","reviews.*","reviews.author.*"]}
```
+```rust
+Query::select(vec!["*", "reviews.*", "reviews.author.*"])
+```
{% /multicode %}
### Use selection patterns {% #select-patterns %}
@@ -515,6 +586,9 @@ Query.equal("title", value: ["Iron Man"])
```http
{"method":"equal","attribute":"title","values":["Iron Man"]}
```
+```rust
+Query::equal("title", json!(["Iron Man"]))
+```
{% /multicode %}
### Not equal {% #not-equal %}
@@ -546,6 +620,9 @@ Query.notEqual("title", value: "Iron Man")
```http
{"method":"notEqual","attribute":"title","values":"Iron Man"}
```
+```rust
+Query::not_equal("title", "Iron Man")
+```
{% /multicode %}
### Less than {% #less-than %}
@@ -577,6 +654,9 @@ Query.lessThan("score", value: 10)
```http
{"method":"lessThan","attribute":"score","values":[10]}
```
+```rust
+Query::less_than("score", 10)
+```
{% /multicode %}
### Less than or equal {% #less-than-equal %}
@@ -608,6 +688,9 @@ Query.lessThanEqual("score", value: 10)
```http
{"method":"lessThanEqual","attribute":"score","values":[10]}
```
+```rust
+Query::less_than_equal("score", 10)
+```
{% /multicode %}
### Greater than {% #greater-than %}
@@ -639,6 +722,9 @@ Query.greaterThan("score", value: 10)
```http
{"method":"greaterThan","attribute":"score","values":[10]}
```
+```rust
+Query::greater_than("score", 10)
+```
{% /multicode %}
### Greater than or equal {% #greater-than-equal %}
@@ -670,6 +756,9 @@ Query.greaterThanEqual("score", value: 10)
```http
{"method":"greaterThanEqual","attribute":"score","values":[10]}
```
+```rust
+Query::greater_than_equal("score", 10)
+```
{% /multicode %}
### Between {% #between %}
@@ -701,6 +790,9 @@ Query.between("price", start: 5, end: 10)
```http
{"method":"between","attribute":"price","values":[5,10]}
```
+```rust
+Query::between("price", 5, 10)
+```
{% /multicode %}
## Null checks {% #null-checks %}
@@ -734,6 +826,9 @@ Query.isNull("name")
```http
{"method":"isNull","attribute":"name"}
```
+```rust
+Query::is_null("name")
+```
{% /multicode %}
### Is not null {% #is-not-null %}
@@ -765,6 +860,9 @@ Query.isNotNull("name")
```http
{"method":"isNotNull","attribute":"name"}
```
+```rust
+Query::is_not_null("name")
+```
{% /multicode %}
## String operations {% #string-operations %}
@@ -798,6 +896,9 @@ Query.startsWith("name", value: "Once upon a time")
```http
{"method":"startsWith","attribute":"name","values":["Once upon a time"]}
```
+```rust
+Query::starts_with("name", "Once upon a time")
+```
{% /multicode %}
### Ends with {% #ends-with %}
@@ -829,6 +930,9 @@ Query.endsWith("name", value: "happily ever after.")
```http
{"method":"endsWith","attribute":"name","values":["happily ever after."]}
```
+```rust
+Query::ends_with("name", "happily ever after.")
+```
{% /multicode %}
### Contains {% #contains %}
@@ -892,6 +996,13 @@ Query.contains("name", value: "Tom")
# For strings
{"method":"contains","attribute":"name","values":["Tom"]}
```
+```rust
+// For arrays
+Query::contains("ingredients", json!(["apple", "banana"]))
+
+// For strings
+Query::contains("name", "Tom")
+```
{% /multicode %}
### Search {% #search %}
@@ -927,6 +1038,9 @@ Query.search("text", value: "key words")
```http
{"method":"search","attribute":"text","values":["key words"]}
```
+```rust
+Query::search("text", "key words")
+```
{% /multicode %}
## Logical operators {% #logical-operators %}
@@ -981,6 +1095,12 @@ Query.and([
```http
{"method":"and","values":[{"method":"lessThan","attribute":"size","values":[10]},{"method":"greaterThan","attribute":"size","values":[5]}]}
```
+```rust
+Query::and(vec![
+ Query::less_than("size", 10).to_string(),
+ Query::greater_than("size", 5).to_string(),
+])
+```
{% /multicode %}
### OR {% #or %}
@@ -1033,6 +1153,12 @@ Query.or([
```http
{"method":"or","values":[{"method":"lessThan","attribute":"size","values":[5]},{"method":"greaterThan","attribute":"size","values":[10]}]}
```
+```rust
+Query::or(vec![
+ Query::less_than("size", 5).to_string(),
+ Query::greater_than("size", 10).to_string(),
+])
+```
{% /multicode %}
## Ordering {% #ordering %}
@@ -1066,6 +1192,9 @@ Query.orderDesc("attribute")
```http
{"method":"orderDesc","attribute":"attribute"}
```
+```rust
+Query::order_desc("attribute")
+```
{% /multicode %}
### Order ascending {% #order-asc %}
@@ -1097,6 +1226,9 @@ Query.orderAsc("attribute")
```http
{"method":"orderAsc","attribute":"attribute"}
```
+```rust
+Query::order_asc("attribute")
+```
{% /multicode %}
## Pagination {% #pagination %}
@@ -1130,6 +1262,9 @@ Query.limit(25)
```http
{"method":"limit","values":[25]}
```
+```rust
+Query::limit(25)
+```
{% /multicode %}
### Offset {% #offset %}
@@ -1161,6 +1296,9 @@ Query.offset(0)
```http
{"method":"offset","values":[0]}
```
+```rust
+Query::offset(0)
+```
{% /multicode %}
### Cursor after {% #cursor-after %}
@@ -1192,6 +1330,9 @@ Query.cursorAfter("62a7...f620")
```http
{"method":"cursorAfter","values":["62a7...f620"]}
```
+```rust
+Query::cursor_after("62a7...f620")
+```
{% /multicode %}
### Cursor before {% #cursor-before %}
@@ -1223,6 +1364,9 @@ Query.cursorBefore("62a7...a600")
```http
{"method":"cursorBefore","values":["62a7...a600"]}
```
+```rust
+Query::cursor_before("62a7...a600")
+```
{% /multicode %}
# Complex queries {% #complex-queries %}
@@ -1287,6 +1431,39 @@ results = databases.list_documents(
```http
{"method":"or","values":[{"method":"and","values":[{"method":"equal","attribute":"category","values":["books"]},{"method":"lessThan","attribute":"price","values":[20]}]},{"method":"and","values":[{"method":"equal","attribute":"category","values":["magazines"]},{"method":"lessThan","attribute":"price","values":[10]}]}]}
```
+```rust
+use appwrite::Client;
+use appwrite::services::databases::Databases;
+use appwrite::query::Query;
+use serde_json::json;
+
+let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+let databases = Databases::new(&client);
+
+let results = databases.list_documents(
+ "",
+ "",
+ Some(vec![
+ Query::or(vec![
+ Query::and(vec![
+ Query::equal("category", json!(["books"])).to_string(),
+ Query::less_than("price", 20).to_string(),
+ ]).to_string(),
+ Query::and(vec![
+ Query::equal("category", json!(["magazines"])).to_string(),
+ Query::less_than("price", 10).to_string(),
+ ]).to_string(),
+ ]).to_string(),
+ ]),
+ None,
+ None,
+ None,
+).await?;
+```
{% /multicode %}
This example demonstrates how to combine `OR` and `AND` operations. The query uses `Query.or()` to match either condition: books under $20 OR magazines under $10.
diff --git a/src/routes/docs/products/databases/operators/+page.markdoc b/src/routes/docs/products/databases/operators/+page.markdoc
index c45b995729..53ebfaa1ed 100644
--- a/src/routes/docs/products/databases/operators/+page.markdoc
+++ b/src/routes/docs/products/databases/operators/+page.markdoc
@@ -280,6 +280,35 @@ tablesDB.updateRow(
})
);
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::operator;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.update_row(
+ "",
+ "",
+ "",
+ Some(json!({
+ "letters": operator::array_append(&["c"])
+ })),
+ None,
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
@@ -337,6 +366,9 @@ Operator.increment(1)
```server-java
Operator.increment(1)
```
+```server-rust
+operator::increment_by(1)
+```
{% /multicode %}
### decrement {% #decrement %}
@@ -374,6 +406,9 @@ Operator.decrement(1)
```server-java
Operator.decrement(1)
```
+```server-rust
+operator::decrement_by(1)
+```
{% /multicode %}
### multiply {% #multiply %}
@@ -411,6 +446,9 @@ Operator.multiply(2)
```server-java
Operator.multiply(2)
```
+```server-rust
+operator::multiply(2)
+```
{% /multicode %}
### divide {% #divide %}
@@ -448,6 +486,9 @@ Operator.divide(5)
```server-java
Operator.divide(5)
```
+```server-rust
+operator::divide(5)
+```
{% /multicode %}
### modulo {% #modulo %}
@@ -485,6 +526,9 @@ Operator.modulo(3)
```server-java
Operator.modulo(3)
```
+```server-rust
+operator::modulo(3)
+```
{% /multicode %}
### power {% #power %}
@@ -522,6 +566,9 @@ Operator.power(2)
```server-java
Operator.power(2)
```
+```server-rust
+operator::power(2)
+```
{% /multicode %}
## Array {% #array %}
@@ -563,6 +610,9 @@ Operator.arrayAppend(['c'])
```server-java
Operator.arrayAppend(List.of("c"))
```
+```server-rust
+operator::array_append(&["c"])
+```
{% /multicode %}
### arrayPrepend {% #array-prepend %}
@@ -600,6 +650,9 @@ Operator.arrayPrepend(['z'])
```server-java
Operator.arrayPrepend(List.of("z"))
```
+```server-rust
+operator::array_prepend(&["z"])
+```
{% /multicode %}
### arrayInsert {% #array-insert %}
@@ -637,6 +690,9 @@ Operator.arrayInsert(1, 'x')
```server-java
Operator.arrayInsert(1, "x")
```
+```server-rust
+operator::array_insert(1, "x")
+```
{% /multicode %}
### arrayRemove {% #array-remove %}
@@ -674,6 +730,9 @@ Operator.arrayRemove('b')
```server-java
Operator.arrayRemove("b")
```
+```server-rust
+operator::array_remove("b")
+```
{% /multicode %}
### arrayUnique {% #array-unique %}
@@ -711,6 +770,9 @@ Operator.arrayUnique()
```server-java
Operator.arrayUnique()
```
+```server-rust
+operator::array_unique()
+```
{% /multicode %}
### arrayIntersect {% #array-intersect %}
@@ -748,6 +810,9 @@ Operator.arrayIntersect(['news', 'tech'])
```server-java
Operator.arrayIntersect(new String[] {"news", "tech"})
```
+```server-rust
+operator::array_intersect(&["news", "tech"])
+```
{% /multicode %}
### arrayDiff {% #array-diff %}
@@ -785,6 +850,9 @@ Operator.arrayDiff(['old'])
```server-java
Operator.arrayDiff(new String[] {"old"})
```
+```server-rust
+operator::array_diff(&["old"])
+```
{% /multicode %}
### arrayFilter {% #array-filter %}
@@ -822,6 +890,9 @@ Operator.arrayFilter(Condition.GreaterThan, 10)
```server-java
Operator.arrayFilter(Condition.GreaterThan, 10)
```
+```server-rust
+operator::array_filter_with_value(operator::Condition::GreaterThan, 10)
+```
{% /multicode %}
## String {% #string %}
@@ -863,6 +934,9 @@ Operator.stringConcat('!')
```server-java
Operator.stringConcat("!")
```
+```server-rust
+operator::string_concat("!")
+```
{% /multicode %}
### stringReplace {% #string-replace %}
@@ -900,6 +974,9 @@ Operator.stringReplace('old', 'new')
```server-java
Operator.stringReplace("old", "new")
```
+```server-rust
+operator::string_replace("old", "new")
+```
{% /multicode %}
## Date {% #date %}
@@ -941,6 +1018,9 @@ Operator.dateAddDays(7)
```server-java
Operator.dateAddDays(7)
```
+```server-rust
+operator::date_add_days(7)
+```
{% /multicode %}
### dateSubDays {% #date-sub-days %}
@@ -978,6 +1058,9 @@ Operator.dateSubDays(3)
```server-java
Operator.dateSubDays(3)
```
+```server-rust
+operator::date_sub_days(3)
+```
{% /multicode %}
### dateSetNow {% #date-set-now %}
@@ -1015,6 +1098,9 @@ Operator.dateSetNow()
```server-java
Operator.dateSetNow()
```
+```server-rust
+operator::date_set_now()
+```
{% /multicode %}
## Boolean {% #boolean %}
@@ -1056,6 +1142,9 @@ Operator.toggle()
```server-java
Operator.toggle()
```
+```server-rust
+operator::toggle()
+```
{% /multicode %}
# Examples {% #examples %}
@@ -1318,6 +1407,35 @@ tablesDB.updateRow(
})
);
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::operator;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.update_row(
+ "",
+ "",
+ "",
+ Some(json!({
+ "upvotes": operator::increment_by(1)
+ })),
+ None,
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
## Add a book to a list
@@ -1576,6 +1694,35 @@ tablesDB.updateRow(
})
);
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::operator;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.update_row(
+ "",
+ "",
+ "",
+ Some(json!({
+ "books": operator::array_append(&["The Great Gatsby"])
+ })),
+ None,
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
## Update the date field in a deletion table
@@ -1834,6 +1981,35 @@ tablesDB.updateRow(
})
);
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::operator;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ let result = tables_db.update_row(
+ "",
+ "",
+ "",
+ Some(json!({
+ "scheduledDeletion": operator::date_add_days(30)
+ })),
+ None,
+ None,
+ ).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
## Update a single row in a transaction
@@ -2222,6 +2398,43 @@ tablesDB.createTransaction(new CoroutineCallback<>((tx, txError) -> {
);
}));
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::operator;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("")
+ .set_key("");
+
+ let tables_db = TablesDB::new(&client);
+
+ // Create a transaction
+ let tx = tables_db.create_transaction(None).await?;
+
+ // Update row with operators inside the transaction
+ let result = tables_db.update_row(
+ "",
+ "",
+ "",
+ Some(json!({
+ "upvotes": operator::increment_by(1),
+ "lastModified": operator::date_set_now()
+ })),
+ None,
+ Some(&tx.id),
+ ).await?;
+
+ // Commit the transaction
+ tables_db.update_transaction(&tx.id, Some(true), None).await?;
+
+ Ok(())
+}
+```
{% /multicode %}
## Update multiple rows in a transaction
@@ -2772,4 +2985,54 @@ tablesDB.createTransaction(new CoroutineCallback<>((tx, txError) -> {
);
}));
```
+```server-rust
+use appwrite::Client;
+use appwrite::services::tables_db::TablesDB;
+use appwrite::operator;
+use serde_json::json;
+
+#[tokio::main]
+async fn main() -> Result<(), Box> {
+ let client = Client::new()
+ .set_endpoint("https://.cloud.appwrite.io/v1")
+ .set_project("