@@ -6,6 +6,8 @@ use std::thread;
6
6
use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
7
7
8
8
use crate :: function:: { OptionalArg , PyFuncArgs } ;
9
+ use crate :: obj:: objint:: PyIntRef ;
10
+ use crate :: obj:: objsequence:: get_sequence_index;
9
11
use crate :: obj:: objstr:: PyStringRef ;
10
12
use crate :: obj:: objtype:: PyClassRef ;
11
13
use crate :: obj:: { objfloat, objint, objtype} ;
@@ -93,6 +95,12 @@ fn time_localtime(secs: OptionalArg<PyObjectRef>, vm: &VirtualMachine) -> PyResu
93
95
Ok ( value)
94
96
}
95
97
98
+ fn time_mktime ( t : PyStructTimeRef , vm : & VirtualMachine ) -> PyResult {
99
+ let datetime = t. get_date_time ( ) ;
100
+ let seconds_since_epoch = datetime. timestamp ( ) as f64 ;
101
+ Ok ( vm. ctx . new_float ( seconds_since_epoch) )
102
+ }
103
+
96
104
/// Construct a localtime from the optional seconds, or get the current local time.
97
105
fn optional_or_localtime (
98
106
secs : OptionalArg < PyObjectRef > ,
@@ -182,17 +190,41 @@ impl PyStructTime {
182
190
fn repr ( & self , _vm : & VirtualMachine ) -> String {
183
191
// TODO: extract year day and isdst somehow..
184
192
format ! (
185
- "time.struct_time(tm_year={}, tm_mon={}, tm_mday={}, tm_hour={}, tm_min={}, tm_sec={}, tm_wday={})" ,
193
+ "time.struct_time(tm_year={}, tm_mon={}, tm_mday={}, tm_hour={}, tm_min={}, tm_sec={}, tm_wday={}, tm_yday={} )" ,
186
194
self . tm. date( ) . year( ) , self . tm. date( ) . month( ) , self . tm. date( ) . day( ) ,
187
195
self . tm. time( ) . hour( ) , self . tm. time( ) . minute( ) , self . tm. time( ) . second( ) ,
188
- self . tm. date( ) . weekday( ) . num_days_from_monday( )
196
+ self . tm. date( ) . weekday( ) . num_days_from_monday( ) ,
197
+ self . tm. date( ) . ordinal( )
189
198
)
190
199
}
191
200
192
201
fn get_date_time ( & self ) -> NaiveDateTime {
193
202
self . tm
194
203
}
195
204
205
+ #[ pymethod( name = "__len__" ) ]
206
+ fn len ( & self , _vm : & VirtualMachine ) -> usize {
207
+ 8
208
+ }
209
+
210
+ #[ pymethod( name = "__getitem__" ) ]
211
+ fn getitem ( & self , needle : PyIntRef , vm : & VirtualMachine ) -> PyResult {
212
+ let index = get_sequence_index ( vm, & needle, 8 ) ?;
213
+ match index {
214
+ 0 => Ok ( vm. ctx . new_int ( self . tm . date ( ) . year ( ) ) ) ,
215
+ 1 => Ok ( vm. ctx . new_int ( self . tm . date ( ) . month ( ) ) ) ,
216
+ 2 => Ok ( vm. ctx . new_int ( self . tm . date ( ) . day ( ) ) ) ,
217
+ 3 => Ok ( vm. ctx . new_int ( self . tm . time ( ) . hour ( ) ) ) ,
218
+ 4 => Ok ( vm. ctx . new_int ( self . tm . time ( ) . minute ( ) ) ) ,
219
+ 5 => Ok ( vm. ctx . new_int ( self . tm . time ( ) . second ( ) ) ) ,
220
+ 6 => Ok ( vm
221
+ . ctx
222
+ . new_int ( self . tm . date ( ) . weekday ( ) . num_days_from_monday ( ) ) ) ,
223
+ 7 => Ok ( vm. ctx . new_int ( self . tm . date ( ) . ordinal ( ) ) ) ,
224
+ _ => unreachable ! ( ) ,
225
+ }
226
+ }
227
+
196
228
#[ pyproperty( name = "tm_year" ) ]
197
229
fn tm_year ( & self , _vm : & VirtualMachine ) -> i32 {
198
230
self . tm . date ( ) . year ( )
@@ -227,6 +259,11 @@ impl PyStructTime {
227
259
fn tm_wday ( & self , _vm : & VirtualMachine ) -> u32 {
228
260
self . tm . date ( ) . weekday ( ) . num_days_from_monday ( )
229
261
}
262
+
263
+ #[ pyproperty( name = "tm_yday" ) ]
264
+ fn tm_yday ( & self , _vm : & VirtualMachine ) -> u32 {
265
+ self . tm . date ( ) . ordinal ( )
266
+ }
230
267
}
231
268
232
269
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
@@ -238,6 +275,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
238
275
"asctime" => ctx. new_rustfunc( time_asctime) ,
239
276
"ctime" => ctx. new_rustfunc( time_ctime) ,
240
277
"gmtime" => ctx. new_rustfunc( time_gmtime) ,
278
+ "mktime" => ctx. new_rustfunc( time_mktime) ,
241
279
"localtime" => ctx. new_rustfunc( time_localtime) ,
242
280
"monotonic" => ctx. new_rustfunc( time_monotonic) ,
243
281
"strftime" => ctx. new_rustfunc( time_strftime) ,
0 commit comments