You've already forked seamantic
Compare commits
4 Commits
2bd654249d
...
0.0.9
| Author | SHA1 | Date | |
|---|---|---|---|
|
9b868c98de
|
|||
|
9cf1f1f0c5
|
|||
|
302612281f
|
|||
|
96f260d02d
|
Generated
+278
-250
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -35,8 +35,8 @@ overflow-checks = true
|
||||
strip = "debuginfo"
|
||||
|
||||
[workspace.dependencies]
|
||||
sea-orm = { version = "2.0.0-rc.7", default-features = false }
|
||||
sea-orm-migration = { version = "2.0.0-rc.7", default-features = false }
|
||||
sea-orm = { version = "2.0.0-rc.16", default-features = false }
|
||||
sea-orm-migration = { version = "2.0.0-rc.16", default-features = false }
|
||||
|
||||
serde = { version = "^1", default-features = false }
|
||||
serde_test = { version = "^1", default-features = false }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "seamantic"
|
||||
version = "0.0.6"
|
||||
version = "0.0.9"
|
||||
|
||||
categories = []
|
||||
description = "A library to enhance SeaORM"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
use core::time::Duration;
|
||||
|
||||
use sea_orm::sea_query::{ArrayType, Nullable, ValueType, ValueTypeErr};
|
||||
use sea_orm::{ColIdx, ColumnType, QueryResult, TryGetError, TryGetable, Value};
|
||||
use sea_orm::{ColIdx, ColumnType, DbErr, QueryResult, TryFromU64, TryGetError, TryGetable, Value};
|
||||
|
||||
// "u64 unsupported by sqlx-sqlite", so use i64 as the bit representation
|
||||
type SeaOrmRepr = i64;
|
||||
@@ -40,7 +40,7 @@ impl ValueType for Seconds {
|
||||
}
|
||||
|
||||
fn type_name() -> String {
|
||||
core::any::type_name::<Duration>().to_string()
|
||||
core::any::type_name::<Self>().to_string()
|
||||
}
|
||||
|
||||
fn array_type() -> ArrayType {
|
||||
@@ -67,6 +67,15 @@ impl TryGetable for Seconds {
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFromU64 for Seconds {
|
||||
fn try_from_u64(n: u64) -> Result<Self, DbErr> {
|
||||
SeaOrmRepr::try_from_u64(n)
|
||||
.map(|i| DurationRepr::from_ne_bytes(i.to_ne_bytes()))
|
||||
.map(Duration::from_secs)
|
||||
.map(Self)
|
||||
}
|
||||
}
|
||||
|
||||
impl Nullable for Seconds {
|
||||
fn null() -> Value {
|
||||
SeaOrmRepr::null()
|
||||
@@ -76,8 +85,8 @@ impl Nullable for Seconds {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use sea_orm::{
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EnumIter,
|
||||
PrimaryKeyTrait,
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait,
|
||||
EnumIter, PrimaryKeyTrait,
|
||||
};
|
||||
|
||||
use super::Seconds;
|
||||
@@ -88,6 +97,7 @@ mod tests {
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
id: u8,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
seconds: Seconds,
|
||||
nullable: Option<Seconds>,
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ impl<T> Id<T> {
|
||||
}
|
||||
|
||||
impl<T> fmt::Debug for Id<T> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||
f.debug_struct("Id")
|
||||
.field("T", &core::any::type_name::<T>())
|
||||
.field("id", &self.id)
|
||||
@@ -140,8 +140,8 @@ impl<T> Nullable for Id<T> {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use sea_orm::{
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EnumIter,
|
||||
PrimaryKeyTrait,
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait,
|
||||
EnumIter, PrimaryKeyTrait,
|
||||
};
|
||||
|
||||
use super::Id;
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
//! [IpAddr], [Ipv4Addr], and [Ipv6Addr] utilities
|
||||
|
||||
use core::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
||||
|
||||
use sea_orm::sea_query::{ArrayType, Nullable, ValueType, ValueTypeErr};
|
||||
use sea_orm::{ColIdx, ColumnType, DbErr, QueryResult, TryFromU64, TryGetError, TryGetable, Value};
|
||||
|
||||
type SeaOrmRepr = String;
|
||||
|
||||
/// Wrapper around [IpAddr]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||
#[cfg_attr(feature = "serde", serde(transparent))]
|
||||
#[repr(transparent)]
|
||||
pub struct IpAddress(pub IpAddr);
|
||||
|
||||
/// Wrapper around [IpAddr]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||
#[cfg_attr(feature = "serde", serde(transparent))]
|
||||
#[repr(transparent)]
|
||||
pub struct Ipv4Address(pub Ipv4Addr);
|
||||
|
||||
/// Wrapper around [IpAddr]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||
#[cfg_attr(feature = "serde", serde(transparent))]
|
||||
#[repr(transparent)]
|
||||
pub struct Ipv6Address(pub Ipv6Addr);
|
||||
|
||||
macro_rules! impl_addr {
|
||||
($t:ty, $inner:ty, $repr:ty) => {
|
||||
impl From<$inner> for $t {
|
||||
fn from(value: $inner) -> Self {
|
||||
Self(value)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<$t> for $inner {
|
||||
fn from(value: $t) -> Self {
|
||||
value.0
|
||||
}
|
||||
}
|
||||
|
||||
impl ValueType for $t {
|
||||
fn try_from(v: Value) -> Result<Self, ValueTypeErr> {
|
||||
<SeaOrmRepr as ValueType>::try_from(v)
|
||||
.and_then(|s| s.parse().map_err(|_| ValueTypeErr))
|
||||
.map(Self)
|
||||
}
|
||||
|
||||
fn type_name() -> String {
|
||||
core::any::type_name::<Self>().to_string()
|
||||
}
|
||||
|
||||
fn array_type() -> ArrayType {
|
||||
SeaOrmRepr::array_type()
|
||||
}
|
||||
|
||||
fn column_type() -> ColumnType {
|
||||
SeaOrmRepr::column_type()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<$t> for Value {
|
||||
fn from(value: $t) -> Self {
|
||||
value.0.to_string().into()
|
||||
}
|
||||
}
|
||||
|
||||
impl TryGetable for $t {
|
||||
fn try_get_by<I: ColIdx>(res: &QueryResult, index: I) -> Result<Self, TryGetError> {
|
||||
SeaOrmRepr::try_get_by(res, index)
|
||||
.and_then(|s| s.parse().map_err(|_| TryGetError::Null(Self::type_name())))
|
||||
.map(Self)
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFromU64 for $t {
|
||||
fn try_from_u64(n: u64) -> Result<Self, DbErr> {
|
||||
SeaOrmRepr::try_from_u64(n)
|
||||
.and_then(|s| {
|
||||
s.parse()
|
||||
.map_err(|_| DbErr::ConvertFromU64(core::any::type_name::<Self>()))
|
||||
})
|
||||
.map(Self)
|
||||
}
|
||||
}
|
||||
|
||||
impl Nullable for $t {
|
||||
fn null() -> Value {
|
||||
SeaOrmRepr::null()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
impl_addr!(IpAddress, IpAddr, SeaOrmRepr);
|
||||
impl_addr!(Ipv4Address, Ipv4Addr, SeaOrmRepr);
|
||||
impl_addr!(Ipv6Address, Ipv6Addr, SeaOrmRepr);
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
mod ipaddress {
|
||||
use sea_orm::{
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait,
|
||||
EnumIter, PrimaryKeyTrait,
|
||||
};
|
||||
|
||||
use super::super::IpAddress;
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "ipaddress")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
id: u8,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
addr: IpAddress,
|
||||
nullable: Option<IpAddress>,
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {}
|
||||
}
|
||||
mod ipv4address {
|
||||
use sea_orm::{
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait,
|
||||
EnumIter, PrimaryKeyTrait,
|
||||
};
|
||||
|
||||
use super::super::Ipv4Address;
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "ipv4address")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
id: u8,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
addr: Ipv4Address,
|
||||
nullable: Option<Ipv4Address>,
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {}
|
||||
}
|
||||
mod ipv6address {
|
||||
use sea_orm::{
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait,
|
||||
EnumIter, PrimaryKeyTrait,
|
||||
};
|
||||
|
||||
use super::super::Ipv6Address;
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "ipv6address")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
id: u8,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
addr: Ipv6Address,
|
||||
nullable: Option<Ipv6Address>,
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {}
|
||||
}
|
||||
}
|
||||
@@ -2,4 +2,5 @@
|
||||
|
||||
pub mod duration;
|
||||
pub mod id;
|
||||
pub mod ip;
|
||||
pub mod path;
|
||||
|
||||
@@ -9,7 +9,7 @@ use std::os::unix::ffi::OsStringExt as _;
|
||||
compile_error!("PathBytes is not supported on Windows");
|
||||
|
||||
use sea_orm::sea_query::{ArrayType, Nullable, ValueType, ValueTypeErr};
|
||||
use sea_orm::{ColIdx, ColumnType, QueryResult, TryGetError, TryGetable, Value};
|
||||
use sea_orm::{ColIdx, ColumnType, DbErr, QueryResult, TryFromU64, TryGetError, TryGetable, Value};
|
||||
|
||||
type SeaOrmRepr = Vec<u8>;
|
||||
|
||||
@@ -47,7 +47,7 @@ impl ValueType for PathBytes {
|
||||
}
|
||||
|
||||
fn type_name() -> String {
|
||||
core::any::type_name::<PathBuf>().to_string()
|
||||
core::any::type_name::<Self>().to_string()
|
||||
}
|
||||
|
||||
fn array_type() -> ArrayType {
|
||||
@@ -74,6 +74,15 @@ impl TryGetable for PathBytes {
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFromU64 for PathBytes {
|
||||
fn try_from_u64(n: u64) -> Result<Self, DbErr> {
|
||||
SeaOrmRepr::try_from_u64(n)
|
||||
.map(OsString::from_vec)
|
||||
.map(PathBuf::from)
|
||||
.map(Self)
|
||||
}
|
||||
}
|
||||
|
||||
impl Nullable for PathBytes {
|
||||
fn null() -> Value {
|
||||
SeaOrmRepr::null()
|
||||
@@ -83,8 +92,8 @@ impl Nullable for PathBytes {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use sea_orm::{
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EnumIter,
|
||||
PrimaryKeyTrait,
|
||||
ActiveModelBehavior, DeriveEntityModel, DerivePrimaryKey, DeriveRelation, EntityTrait,
|
||||
EnumIter, PrimaryKeyTrait,
|
||||
};
|
||||
|
||||
use super::PathBytes;
|
||||
@@ -95,6 +104,7 @@ mod tests {
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
id: u8,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
path: PathBytes,
|
||||
nullable: Option<PathBytes>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user