// SPDX-FileCopyrightText: 2024 Joshua Goins // SPDX-License-Identifier: GPL-3.0-or-later use crate::serde_utilities::parse_datetime; use crate::serde_utilities::parse_url; use cxx_qt_lib::{QDateTime, QString, QUrl}; use serde::{Deserialize, Serialize}; #[cxx_qt::bridge] pub mod entities { #[namespace = "rust::cxxqtlib1"] unsafe extern "C++" { include!("cxx-qt-lib/common.h"); #[rust_name = "make_author_qml"] fn make_unique() -> UniquePtr; // TODO: lol #[rust_name = "make_account_qml"] fn make_unique() -> UniquePtr; // TODO: lol } unsafe extern "C++" { include!("cxx-qt-lib/qstring.h"); type QString = cxx_qt_lib::QString; include!("cxx-qt-lib/qurl.h"); type QUrl = cxx_qt_lib::QUrl; include!("cxx-qt-lib/qvariant.h"); type QVariant = cxx_qt_lib::QVariant; include!("entities.h"); #[rust_name = "qvariant_can_convert_account"] fn qvariantCanConvertAccount(value: &QVariant) -> bool; } // TODO: I don't think this needs to be a qml_element unsafe extern "RustQt" { #[qobject] #[qml_element = "Author"] #[qml_uncreatable] #[qproperty(QString, did)] #[qproperty(QString, handle)] #[qproperty(QString, display_name, cxx_name = "displayName")] #[qproperty(QUrl, avatar)] type AuthorQML = super::Author; #[qobject] #[qml_element = "Account"] #[qml_uncreatable] type AccountQML = super::Account; } #[namespace = "rust::cxxqtlib1::qvariant"] unsafe extern "C++" { include!("cxx-qt-lib/qvariant.h"); #[rust_name = "qvariant_construct_account"] unsafe fn qvariantConstruct(value: &*mut AuthorQML) -> QVariant; #[rust_name = "qvariant_value_or_default_account"] fn qvariantValueOrDefault(value: &QVariant) -> *mut AuthorQML; } } #[derive(Debug, Clone, Default)] pub enum AccountStatus { #[default] NotLoaded, Loaded, } #[derive(Debug, Default, Clone)] // TODO: remove default? pub struct Account { pub status: AccountStatus, pub identifier: QString, pub access_jwt: QString, pub refresh_jwt: QString, } #[derive(Deserialize, Debug, Default, Clone)] // TODO: remove default? pub struct Author { pub did: QString, handle: QString, #[serde(rename = "displayName")] display_name: QString, #[serde(default)] #[serde(deserialize_with = "parse_url")] avatar: QUrl, labels: Vec