use pyo3::prelude::*;
use pyo3::types::PyDict;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OpenGraph {
pub title: Option<String>,
pub r#type: Option<String>,
pub url: Option<String>,
pub image: Option<String>,
pub description: Option<String>,
pub site_name: Option<String>,
pub locale: Option<String>,
pub locale_alternate: Vec<String>,
pub images: Vec<OgImage>,
pub videos: Vec<OgVideo>,
pub audios: Vec<OgAudio>,
pub article: Option<OgArticle>,
pub book: Option<OgBook>,
pub profile: Option<OgProfile>,
pub fb_app_id: Option<String>,
pub fb_admins: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OgImage {
pub url: String,
pub secure_url: Option<String>,
pub r#type: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
pub alt: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OgVideo {
pub url: String,
pub secure_url: Option<String>,
pub r#type: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OgAudio {
pub url: String,
pub secure_url: Option<String>,
pub r#type: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OgArticle {
pub published_time: Option<String>,
pub modified_time: Option<String>,
pub expiration_time: Option<String>,
pub author: Vec<String>,
pub section: Option<String>,
pub tag: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OgBook {
pub author: Vec<String>,
pub isbn: Option<String>,
pub release_date: Option<String>,
pub tag: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct OgProfile {
pub first_name: Option<String>,
pub last_name: Option<String>,
pub username: Option<String>,
pub gender: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TwitterCard {
pub card: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub image: Option<String>,
pub image_alt: Option<String>,
pub site: Option<String>,
pub site_id: Option<String>,
pub creator: Option<String>,
pub creator_id: Option<String>,
pub app: Option<TwitterApp>,
pub player: Option<TwitterPlayer>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TwitterApp {
pub name_iphone: Option<String>,
pub id_iphone: Option<String>,
pub url_iphone: Option<String>,
pub name_ipad: Option<String>,
pub id_ipad: Option<String>,
pub url_ipad: Option<String>,
pub name_googleplay: Option<String>,
pub id_googleplay: Option<String>,
pub url_googleplay: Option<String>,
pub country: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct TwitterPlayer {
pub url: String,
pub width: Option<u32>,
pub height: Option<u32>,
pub stream: Option<String>,
}
impl OpenGraph {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
if let Some(ref v) = self.title {
let _ = dict.set_item("title", v);
}
if let Some(ref v) = self.r#type {
let _ = dict.set_item("type", v);
}
if let Some(ref v) = self.url {
let _ = dict.set_item("url", v);
}
if let Some(ref v) = self.image {
let _ = dict.set_item("image", v);
}
if let Some(ref v) = self.description {
let _ = dict.set_item("description", v);
}
if let Some(ref v) = self.site_name {
let _ = dict.set_item("site_name", v);
}
if let Some(ref v) = self.locale {
let _ = dict.set_item("locale", v);
}
if !self.locale_alternate.is_empty() {
let _ = dict.set_item("locale_alternate", self.locale_alternate.clone());
}
if !self.images.is_empty() {
let images: Vec<_> = self.images.iter().map(|img| img.to_py_dict(py)).collect();
let _ = dict.set_item("images", images);
}
if !self.videos.is_empty() {
let videos: Vec<_> = self.videos.iter().map(|v| v.to_py_dict(py)).collect();
let _ = dict.set_item("videos", videos);
}
if !self.audios.is_empty() {
let audios: Vec<_> = self.audios.iter().map(|a| a.to_py_dict(py)).collect();
let _ = dict.set_item("audios", audios);
}
if let Some(ref article) = self.article {
let _ = dict.set_item("article", article.to_py_dict(py));
}
if let Some(ref book) = self.book {
let _ = dict.set_item("book", book.to_py_dict(py));
}
if let Some(ref profile) = self.profile {
let _ = dict.set_item("profile", profile.to_py_dict(py));
}
if let Some(ref v) = self.fb_app_id {
let _ = dict.set_item("fb_app_id", v);
}
if let Some(ref v) = self.fb_admins {
let _ = dict.set_item("fb_admins", v);
}
dict.unbind()
}
}
impl OgImage {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
let _ = dict.set_item("url", &self.url);
if let Some(ref v) = self.secure_url {
let _ = dict.set_item("secure_url", v);
}
if let Some(ref v) = self.r#type {
let _ = dict.set_item("type", v);
}
if let Some(v) = self.width {
let _ = dict.set_item("width", v);
}
if let Some(v) = self.height {
let _ = dict.set_item("height", v);
}
if let Some(ref v) = self.alt {
let _ = dict.set_item("alt", v);
}
dict.unbind()
}
}
impl OgVideo {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
let _ = dict.set_item("url", &self.url);
if let Some(ref v) = self.secure_url {
let _ = dict.set_item("secure_url", v);
}
if let Some(ref v) = self.r#type {
let _ = dict.set_item("type", v);
}
if let Some(v) = self.width {
let _ = dict.set_item("width", v);
}
if let Some(v) = self.height {
let _ = dict.set_item("height", v);
}
dict.unbind()
}
}
impl OgAudio {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
let _ = dict.set_item("url", &self.url);
if let Some(ref v) = self.secure_url {
let _ = dict.set_item("secure_url", v);
}
if let Some(ref v) = self.r#type {
let _ = dict.set_item("type", v);
}
dict.unbind()
}
}
impl OgArticle {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
if let Some(ref v) = self.published_time {
let _ = dict.set_item("published_time", v);
}
if let Some(ref v) = self.modified_time {
let _ = dict.set_item("modified_time", v);
}
if let Some(ref v) = self.expiration_time {
let _ = dict.set_item("expiration_time", v);
}
if !self.author.is_empty() {
let _ = dict.set_item("author", self.author.clone());
}
if let Some(ref v) = self.section {
let _ = dict.set_item("section", v);
}
if !self.tag.is_empty() {
let _ = dict.set_item("tag", self.tag.clone());
}
dict.unbind()
}
}
impl OgBook {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
if !self.author.is_empty() {
let _ = dict.set_item("author", self.author.clone());
}
if let Some(ref v) = self.isbn {
let _ = dict.set_item("isbn", v);
}
if let Some(ref v) = self.release_date {
let _ = dict.set_item("release_date", v);
}
if !self.tag.is_empty() {
let _ = dict.set_item("tag", self.tag.clone());
}
dict.unbind()
}
}
impl OgProfile {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
if let Some(ref v) = self.first_name {
let _ = dict.set_item("first_name", v);
}
if let Some(ref v) = self.last_name {
let _ = dict.set_item("last_name", v);
}
if let Some(ref v) = self.username {
let _ = dict.set_item("username", v);
}
if let Some(ref v) = self.gender {
let _ = dict.set_item("gender", v);
}
dict.unbind()
}
}
impl TwitterCard {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
if let Some(ref v) = self.card {
let _ = dict.set_item("card", v);
}
if let Some(ref v) = self.title {
let _ = dict.set_item("title", v);
}
if let Some(ref v) = self.description {
let _ = dict.set_item("description", v);
}
if let Some(ref v) = self.image {
let _ = dict.set_item("image", v);
}
if let Some(ref v) = self.image_alt {
let _ = dict.set_item("image_alt", v);
}
if let Some(ref v) = self.site {
let _ = dict.set_item("site", v);
}
if let Some(ref v) = self.site_id {
let _ = dict.set_item("site_id", v);
}
if let Some(ref v) = self.creator {
let _ = dict.set_item("creator", v);
}
if let Some(ref v) = self.creator_id {
let _ = dict.set_item("creator_id", v);
}
if let Some(ref app) = self.app {
let _ = dict.set_item("app", app.to_py_dict(py));
}
if let Some(ref player) = self.player {
let _ = dict.set_item("player", player.to_py_dict(py));
}
dict.unbind()
}
}
impl TwitterApp {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
if let Some(ref v) = self.name_iphone {
let _ = dict.set_item("name_iphone", v);
}
if let Some(ref v) = self.id_iphone {
let _ = dict.set_item("id_iphone", v);
}
if let Some(ref v) = self.url_iphone {
let _ = dict.set_item("url_iphone", v);
}
if let Some(ref v) = self.name_ipad {
let _ = dict.set_item("name_ipad", v);
}
if let Some(ref v) = self.id_ipad {
let _ = dict.set_item("id_ipad", v);
}
if let Some(ref v) = self.url_ipad {
let _ = dict.set_item("url_ipad", v);
}
if let Some(ref v) = self.name_googleplay {
let _ = dict.set_item("name_googleplay", v);
}
if let Some(ref v) = self.id_googleplay {
let _ = dict.set_item("id_googleplay", v);
}
if let Some(ref v) = self.url_googleplay {
let _ = dict.set_item("url_googleplay", v);
}
if let Some(ref v) = self.country {
let _ = dict.set_item("country", v);
}
dict.unbind()
}
}
impl TwitterPlayer {
pub fn to_py_dict(&self, py: Python) -> Py<PyDict> {
let dict = PyDict::new_bound(py);
let _ = dict.set_item("url", &self.url);
if let Some(v) = self.width {
let _ = dict.set_item("width", v);
}
if let Some(v) = self.height {
let _ = dict.set_item("height", v);
}
if let Some(ref v) = self.stream {
let _ = dict.set_item("stream", v);
}
dict.unbind()
}
}