// zotapi - Rust wrapper for Sot API as implemented by Hubzilla // Copyright (C) 2018 Harald Eilertsen // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . use crate::{ client::{self, Client}, error::Error, }; use serde::{Serialize, Serializer}; use std::collections::BTreeMap; /// Data type for values that an Item can hold. pub enum ItemData<'a> { /// A single value, either textual or numeric. Value(&'a str), } impl<'a> From<&'a str> for ItemData<'a> { fn from(orig: &'a str) -> ItemData<'a> { ItemData::Value(orig) } } impl<'a> Serialize for ItemData<'a> { fn serialize(&self, serializer: S) -> Result where S: Serializer { match &self { ItemData::Value(s) => s.serialize(serializer), } } } impl<'a> ToString for ItemData<'a> { fn to_string(&self) -> String { match &self { ItemData::Value(s) => s.to_string(), } } } /// A structure to help you create an item in a declarative way. /// /// Typical usage: /// /// ```no_run /// let client = zotapi::Client::new("https://myhub.com", "mychannel", "mypw"); /// let new_post = client.item() /// .title("A title") /// .body("The body of the post") /// .file("/my/photo.jpg") /// .create()?; /// # Ok::<(), zotapi::Error>(()) /// ``` pub struct ItemBuilder<'a> { client : &'a Client, data : BTreeMap<&'a str, ItemData<'a>>, files: Vec<&'a str>, } impl<'a> ItemBuilder<'a> { pub fn new(client: &'a Client) -> ItemBuilder<'a> { ItemBuilder { client: client, data: BTreeMap::new(), files: vec![], } } /// Add a title to the post pub fn title(&mut self, text: &'a str) -> &mut ItemBuilder<'a> { self.data.insert("title", ItemData::Value(text)); self } /// Add the body of the post pub fn body(&mut self, text: &'a str) -> &mut ItemBuilder<'a> { self.data.insert("body", ItemData::Value(text)); self } /// Add a file attachment to the post pub fn file(&mut self, fname: &'a str) -> &mut ItemBuilder<'a> { self.files.push(fname); self } /// Create the item by poting it to the server pub fn create(&self) -> Result { if self.files.is_empty() { self.client.post_data(client::ZOTAPI_ITEM_UPDATE_PATH, &self.data) } else { self.client.post_multipart(client::ZOTAPI_ITEM_UPDATE_PATH, &self.data, &self.files) } } }