1+ #![ doc = include_str ! ( "../README.md" ) ]
12use std:: fmt:: Debug ;
23use std:: marker:: PhantomData ;
34use std:: str:: FromStr ;
@@ -6,20 +7,20 @@ use thiserror::Error;
67#[ derive( Debug ) ]
78pub struct Tagged < Rep , Tag > ( Rep , PhantomData < Tag > ) ;
89
9- pub trait Refine < Tag > : Sized {
10+ pub trait Refine < Rep > : Sized {
1011 type RefineError ;
1112
12- fn refine ( self ) -> Result < Self , Self :: RefineError > {
13- Ok ( self )
13+ fn refine ( rep : Rep ) -> Result < Rep , Self :: RefineError > {
14+ Ok ( rep )
1415 }
1516}
1617
1718impl < Rep , Tag > Tagged < Rep , Tag > {
18- pub fn new ( rep : Rep ) -> Result < Self , Rep :: RefineError >
19+ pub fn new ( rep : Rep ) -> Result < Self , Tag :: RefineError >
1920 where
20- Rep : Refine < Tag > ,
21+ Tag : Refine < Rep > ,
2122 {
22- rep . refine ( ) . map ( |rep| Tagged ( rep, PhantomData ) )
23+ Tag :: refine ( rep ) . map ( |rep| Tagged ( rep, PhantomData ) )
2324 }
2425 pub fn rep ( & self ) -> & Rep {
2526 & self . 0
@@ -58,17 +59,19 @@ impl<Rep: Clone, Tag> Clone for Tagged<Rep, Tag> {
5859#[ derive( Debug , Error ) ]
5960pub enum ParseError < Rep , Tag >
6061where
61- Rep : FromStr + Refine < Tag > ,
62+ Rep : FromStr ,
63+ Tag : Refine < Rep > ,
6264{
6365 #[ error( "Decode failed: {0}" ) ]
6466 Decode ( Rep :: Err ) ,
6567 #[ error( "Refine failed: {0}" ) ]
66- Refine ( Rep :: RefineError ) ,
68+ Refine ( Tag :: RefineError ) ,
6769}
6870
6971impl < Rep , Tag > FromStr for Tagged < Rep , Tag >
7072where
71- Rep : FromStr + Refine < Tag > ,
73+ Rep : FromStr ,
74+ Tag : Refine < Rep > ,
7275{
7376 type Err = ParseError < Rep , Tag > ;
7477 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
@@ -100,8 +103,9 @@ impl<Rep: Serialize, Tag> Serialize for Tagged<Rep, Tag> {
100103#[ cfg( feature = "serde" ) ]
101104impl < ' de , Rep , Tag > Deserialize < ' de > for Tagged < Rep , Tag >
102105where
103- Rep : Deserialize < ' de > + Refine < Tag > ,
104- Rep :: RefineError : Display ,
106+ Rep : Deserialize < ' de > ,
107+ Tag : Refine < Rep > ,
108+ Tag :: RefineError : Display ,
105109{
106110 fn deserialize < D > (
107111 deserializer : D ,
@@ -165,8 +169,9 @@ mod diesel_impl {
165169
166170 impl < DB , Rep , Tag , ST > FromSql < ST , DB > for Tagged < Rep , Tag >
167171 where
168- Rep : FromSql < ST , DB > + Refine < Tag > ,
169- Rep :: RefineError : ' static + Error + Send + Sync ,
172+ Rep : FromSql < ST , DB > ,
173+ Tag : Refine < Rep > ,
174+ Tag :: RefineError : ' static + Error + Send + Sync ,
170175 DB : Backend ,
171176 {
172177 fn from_sql (
@@ -180,8 +185,9 @@ mod diesel_impl {
180185 impl < Rep , Tag , ST , DB > Queryable < ST , DB >
181186 for Tagged < Rep , Tag >
182187 where
183- Rep : Queryable < ST , DB > + Refine < Tag > ,
184- Rep :: RefineError : ' static + Error + Send + Sync ,
188+ Rep : Queryable < ST , DB > ,
189+ Tag : Refine < Rep > ,
190+ Tag :: RefineError : ' static + Error + Send + Sync ,
185191 DB : Backend ,
186192 {
187193 type Row = Rep :: Row ;
0 commit comments