1
- use crate :: ffi:: { ada_parse, ada_parse_with_base} ;
2
1
use thiserror:: Error ;
3
2
4
3
pub mod ffi {
@@ -73,7 +72,7 @@ pub mod ffi {
73
72
pub fn ada_get_url_components ( url : * mut ada_url ) -> ada_url_components ;
74
73
75
74
// Getters
76
- pub fn ada_get_origin ( url : * mut ada_url ) -> * mut ada_owned_string ;
75
+ pub fn ada_get_origin ( url : * mut ada_url ) -> ada_owned_string ;
77
76
pub fn ada_get_href ( url : * mut ada_url ) -> ada_string ;
78
77
pub fn ada_get_username ( url : * mut ada_url ) -> ada_string ;
79
78
pub fn ada_get_password ( url : * mut ada_url ) -> ada_string ;
@@ -117,17 +116,11 @@ pub enum Error {
117
116
}
118
117
119
118
pub struct Url {
120
- origin : Option < * mut ffi:: ada_owned_string > ,
121
119
url : * mut ffi:: ada_url ,
122
120
}
123
121
124
122
impl Drop for Url {
125
123
fn drop ( & mut self ) {
126
- if let Some ( origin) = self . origin {
127
- unsafe {
128
- ffi:: ada_free_owned_string ( origin) ;
129
- }
130
- }
131
124
unsafe {
132
125
ffi:: ada_free ( self . url ) ;
133
126
}
@@ -146,19 +139,18 @@ impl Url {
146
139
pub fn parse ( input : & str , base : Option < & str > ) -> Result < Url , Error > {
147
140
let url_aggregator = match base {
148
141
Some ( base) => unsafe {
149
- ada_parse_with_base (
142
+ ffi :: ada_parse_with_base (
150
143
input. as_ptr ( ) . cast ( ) ,
151
144
input. len ( ) ,
152
145
base. as_ptr ( ) . cast ( ) ,
153
146
base. len ( ) ,
154
147
)
155
148
} ,
156
- None => unsafe { ada_parse ( input. as_ptr ( ) . cast ( ) , input. len ( ) ) } ,
149
+ None => unsafe { ffi :: ada_parse ( input. as_ptr ( ) . cast ( ) , input. len ( ) ) } ,
157
150
} ;
158
151
159
152
if unsafe { ffi:: ada_is_valid ( url_aggregator) } {
160
153
Ok ( Url {
161
- origin : None ,
162
154
url : url_aggregator,
163
155
} )
164
156
} else {
@@ -190,8 +182,9 @@ impl Url {
190
182
191
183
pub fn origin ( & mut self ) -> & str {
192
184
unsafe {
193
- self . origin = Some ( ffi:: ada_get_origin ( self . url ) ) ;
194
- self . origin . map ( |o| ( * o) . as_ref ( ) ) . unwrap_or ( "" )
185
+ let out = ffi:: ada_get_origin ( self . url ) ;
186
+ let slice = std:: slice:: from_raw_parts ( out. data . cast ( ) , out. length ) ;
187
+ std:: str:: from_utf8_unchecked ( slice)
195
188
}
196
189
}
197
190
0 commit comments