1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
use crate::prelude::tz::*;
use chrono::offset::{Offset, TimeZone};
use chrono::{Datelike, FixedOffset, NaiveDate};
use chrono_tz::America::*;
use std::str::FromStr;
use strum_macros::EnumString;
#[derive(Debug, EnumString, Clone)]
#[non_exhaustive]
pub enum America {
    #[strum(disabled = "true")]
    Argentina(Argentina),
    #[strum(disabled = "true")]
    Indiana(Indiana),
    #[strum(disabled = "true")]
    Kentucky(Kentucky),
    #[strum(disabled = "true")]
    NorthDakota(NorthDakota),
    Adak,
    Anchorage,
    Anguilla,
    Antigua,
    Araguaina,
    Aruba,
    Asuncion,
    Atikokan,
    Atka,
    Bahia,
    BahiaBanderas,
    Barbados,
    Belem,
    Belize,
    BlancSablon,
    BoaVista,
    Bogota,
    Boise,
    BuenosAires,
    CambridgeBay,
    CampoGrande,
    Cancun,
    Caracas,
    Catamarca,
    Cayenne,
    Cayman,
    Chicago,
    Chihuahua,
    CoralHarbour,
    Cordoba,
    CostaRica,
    Creston,
    Cuiaba,
    Curacao,
    Danmarkshavn,
    Dawson,
    DawsonCreek,
    Denver,
    Detroit,
    Dominica,
    Edmonton,
    Eirunepe,
    ElSalvador,
    Ensenada,
    FortNelson,
    FortWayne,
    Fortaleza,
    GlaceBay,
    Godthab,
    GooseBay,
    GrandTurk,
    Grenada,
    Guadeloupe,
    Guatemala,
    Guayaquil,
    Guyana,
    Halifax,
    Havana,
    Hermosillo,
    Indianapolis,
    Inuvik,
    Iqaluit,
    Jamaica,
    Jujuy,
    Juneau,
    KnoxIN,
    Kralendijk,
    LaPaz,
    Lima,
    LosAngeles,
    Louisville,
    LowerPrinces,
    Maceio,
    Managua,
    Manaus,
    Marigot,
    Martinique,
    Matamoros,
    Mazatlan,
    Mendoza,
    Menominee,
    Merida,
    Metlakatla,
    MexicoCity,
    Miquelon,
    Moncton,
    Monterrey,
    Montevideo,
    Montreal,
    Montserrat,
    Nassau,
    NewYork,
    Nipigon,
    Nome,
    Noronha,
    Ojinaga,
    Panama,
    Pangnirtung,
    Paramaribo,
    Phoenix,
    PortOfSpain,
    PortAuPrince,
    PortoAcre,
    PortoVelho,
    PuertoRico,
    PuntaArenas,
    RainyRiver,
    RankinInlet,
    Recife,
    Regina,
    Resolute,
    RioBranco,
    Rosario,
    SantaIsabel,
    Santarem,
    Santiago,
    SantoDomingo,
    SaoPaulo,
    Scoresbysund,
    Shiprock,
    Sitka,
    StBarthelemy,
    StJohns,
    StKitts,
    StLucia,
    StThomas,
    StVincent,
    SwiftCurrent,
    Tegucigalpa,
    Thule,
    ThunderBay,
    Tijuana,
    Toronto,
    Tortola,
    Vancouver,
    Virgin,
    Whitehorse,
    Winnipeg,
    Yakutat,
    Yellowknife,
}
impl America {
    pub(crate) fn try_from_path(p: &[&str]) -> Result<Self, Error> {
        if p.len() != 1 && p.len() != 2 {
            return Err(Error::TooManyElements(p.len()));
        }
        match p[0] {
            "Argentina" => Ok(Self::Argentina(Argentina::try_from_path(&p[1..])?)),
            "Indiana" => Ok(Self::Indiana(Indiana::try_from_path(&p[1..])?)),
            "Kentucky" => Ok(Self::Kentucky(Kentucky::try_from_path(&p[1..])?)),
            "North_Dakota" => Ok(Self::NorthDakota(NorthDakota::try_from_path(&p[1..])?)),
            "Bahia_Banderas" => Ok(Self::BahiaBanderas),
            "Blanc-Sablon" => Ok(Self::BlancSablon),
            "Boa_Vista" => Ok(Self::BoaVista),
            "Buenos_Aires" => Ok(Self::BuenosAires),
            "Cambridge_Bay" => Ok(Self::CambridgeBay),
            "Campo_Grande" => Ok(Self::CampoGrande),
            "Coral_Harbour" => Ok(Self::CoralHarbour),
            "Thunder_Bay" => Ok(Self::ThunderBay),
            "Swift_Current" => Ok(Self::SwiftCurrent),
            "St_Vincent" => Ok(Self::StVincent),
            "St_Thomas" => Ok(Self::StThomas),
            "St_Lucia" => Ok(Self::StLucia),
            "St_Kitts" => Ok(Self::StKitts),
            "St_Johns" => Ok(Self::StJohns),
            "St_Barthelemy" => Ok(Self::StBarthelemy),
            "Sao_Paulo" => Ok(Self::SaoPaulo),
            "Santo_Domingo" => Ok(Self::SantoDomingo),
            "Santa_Isabel" => Ok(Self::SantaIsabel),
            "Rio_Branco" => Ok(Self::RioBranco),
            "Rankin_Inlet" => Ok(Self::RankinInlet),
            "Rainy_River" => Ok(Self::RainyRiver),
            "Punta_Arenas" => Ok(Self::PuntaArenas),
            "Costa_Rica" => Ok(Self::CostaRica),
            "Dawson_Creek" => Ok(Self::DawsonCreek),
            "El_Salvador" => Ok(Self::ElSalvador),
            "Fort_Nelson" => Ok(Self::FortNelson),
            "Fort_Wayne" => Ok(Self::FortWayne),
            "Glace_Bay" => Ok(Self::GlaceBay),
            "Goose_Bay" => Ok(Self::GooseBay),
            "Grand_Turk" => Ok(Self::GrandTurk),
            "Knox_IN" => Ok(Self::KnoxIN),
            "La_Paz" => Ok(Self::LaPaz),
            "Los_Angeles" => Ok(Self::LosAngeles),
            "Lower_Princes" => Ok(Self::LowerPrinces),
            "Mexico_City" => Ok(Self::MexicoCity),
            "New_York" => Ok(Self::NewYork),
            "Port_of_Spain" => Ok(Self::PortOfSpain),
            "Port-au-Prince" => Ok(Self::PortAuPrince),
            "Porto_Acre" => Ok(Self::PortoAcre),
            "Porto_Velho" => Ok(Self::PortoVelho),
            "Puerto_Rico" => Ok(Self::PuertoRico),
            other => Self::from_str(other).map_err(|_| Error::WrongTimeZone(p[0].to_string())),
        }
    }
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        match self {
            Self::Argentina(argentina) => argentina.get_tz(datetime),
            Self::Indiana(indiana) => indiana.get_tz(datetime),
            Self::Kentucky(kentucky) => kentucky.get_tz(datetime),
            Self::NorthDakota(north_dakota) => north_dakota.get_tz(datetime),
            left => {
                let p = match left {
                    Self::Adak => Adak.from_utc_datetime(datetime),
                    Self::Anchorage => Anchorage.from_utc_datetime(datetime),
                    Self::Anguilla => Anguilla.from_utc_datetime(datetime),
                    Self::Antigua => Antigua.from_utc_datetime(datetime),
                    Self::Araguaina => Araguaina.from_utc_datetime(datetime),
                    Self::Aruba => Aruba.from_utc_datetime(datetime),
                    Self::Asuncion => Asuncion.from_utc_datetime(datetime),
                    Self::Atikokan => Atikokan.from_utc_datetime(datetime),
                    Self::Atka => Atka.from_utc_datetime(datetime),
                    Self::Bahia => Bahia.from_utc_datetime(datetime),
                    Self::BahiaBanderas => Bahia_Banderas.from_utc_datetime(datetime),
                    Self::Barbados => Barbados.from_utc_datetime(datetime),
                    Self::Belem => Belem.from_utc_datetime(datetime),
                    Self::Belize => Belize.from_utc_datetime(datetime),
                    Self::BlancSablon => BlancSablon.from_utc_datetime(datetime),
                    Self::BoaVista => Boa_Vista.from_utc_datetime(datetime),
                    Self::Bogota => Bogota.from_utc_datetime(datetime),
                    Self::Boise => Boise.from_utc_datetime(datetime),
                    Self::BuenosAires => Buenos_Aires.from_utc_datetime(datetime),
                    Self::CambridgeBay => Cambridge_Bay.from_utc_datetime(datetime),
                    Self::CampoGrande => Campo_Grande.from_utc_datetime(datetime),
                    Self::Cancun => Cancun.from_utc_datetime(datetime),
                    Self::Caracas => Caracas.from_utc_datetime(datetime),
                    Self::Catamarca => Catamarca.from_utc_datetime(datetime),
                    Self::Cayenne => Cayenne.from_utc_datetime(datetime),
                    Self::Cayman => Cayman.from_utc_datetime(datetime),
                    Self::Chicago => Chicago.from_utc_datetime(datetime),
                    Self::Chihuahua => Chihuahua.from_utc_datetime(datetime),
                    Self::CoralHarbour => Coral_Harbour.from_utc_datetime(datetime),
                    Self::Cordoba => Cordoba.from_utc_datetime(datetime),
                    Self::CostaRica => Costa_Rica.from_utc_datetime(datetime),
                    Self::Creston => Creston.from_utc_datetime(datetime),
                    Self::Cuiaba => Cuiaba.from_utc_datetime(datetime),
                    Self::Curacao => Curacao.from_utc_datetime(datetime),
                    Self::Danmarkshavn => Danmarkshavn.from_utc_datetime(datetime),
                    Self::Dawson => Dawson.from_utc_datetime(datetime),
                    Self::DawsonCreek => Dawson_Creek.from_utc_datetime(datetime),
                    Self::Denver => Denver.from_utc_datetime(datetime),
                    Self::Detroit => Detroit.from_utc_datetime(datetime),
                    Self::Dominica => Dominica.from_utc_datetime(datetime),
                    Self::Edmonton => Edmonton.from_utc_datetime(datetime),
                    Self::Eirunepe => Eirunepe.from_utc_datetime(datetime),
                    Self::ElSalvador => El_Salvador.from_utc_datetime(datetime),
                    Self::Ensenada => Ensenada.from_utc_datetime(datetime),
                    Self::FortNelson => Fort_Nelson.from_utc_datetime(datetime),
                    Self::FortWayne => Fort_Wayne.from_utc_datetime(datetime),
                    Self::Fortaleza => Fortaleza.from_utc_datetime(datetime),
                    Self::GlaceBay => Glace_Bay.from_utc_datetime(datetime),
                    Self::Godthab => Godthab.from_utc_datetime(datetime),
                    Self::GooseBay => Goose_Bay.from_utc_datetime(datetime),
                    Self::GrandTurk => Grand_Turk.from_utc_datetime(datetime),
                    Self::Grenada => Grenada.from_utc_datetime(datetime),
                    Self::Guadeloupe => Guadeloupe.from_utc_datetime(datetime),
                    Self::Guatemala => Guatemala.from_utc_datetime(datetime),
                    Self::Guayaquil => Guayaquil.from_utc_datetime(datetime),
                    Self::Guyana => Guyana.from_utc_datetime(datetime),
                    Self::Halifax => Halifax.from_utc_datetime(datetime),
                    Self::Havana => Havana.from_utc_datetime(datetime),
                    Self::Hermosillo => Hermosillo.from_utc_datetime(datetime),
                    Self::Indianapolis => Indianapolis.from_utc_datetime(datetime),
                    Self::Inuvik => Inuvik.from_utc_datetime(datetime),
                    Self::Iqaluit => Iqaluit.from_utc_datetime(datetime),
                    Self::Jamaica => Jamaica.from_utc_datetime(datetime),
                    Self::Jujuy => Jujuy.from_utc_datetime(datetime),
                    Self::Juneau => Juneau.from_utc_datetime(datetime),
                    Self::KnoxIN => Knox_IN.from_utc_datetime(datetime),
                    Self::Kralendijk => Kralendijk.from_utc_datetime(datetime),
                    Self::LaPaz => La_Paz.from_utc_datetime(datetime),
                    Self::Lima => Lima.from_utc_datetime(datetime),
                    Self::LosAngeles => Los_Angeles.from_utc_datetime(datetime),
                    Self::Louisville => Louisville.from_utc_datetime(datetime),
                    Self::LowerPrinces => Lower_Princes.from_utc_datetime(datetime),
                    Self::Maceio => Maceio.from_utc_datetime(datetime),
                    Self::Managua => Managua.from_utc_datetime(datetime),
                    Self::Manaus => Manaus.from_utc_datetime(datetime),
                    Self::Marigot => Marigot.from_utc_datetime(datetime),
                    Self::Martinique => Martinique.from_utc_datetime(datetime),
                    Self::Matamoros => Matamoros.from_utc_datetime(datetime),
                    Self::Mazatlan => Mazatlan.from_utc_datetime(datetime),
                    Self::Mendoza => Mendoza.from_utc_datetime(datetime),
                    Self::Menominee => Menominee.from_utc_datetime(datetime),
                    Self::Merida => Merida.from_utc_datetime(datetime),
                    Self::Metlakatla => Metlakatla.from_utc_datetime(datetime),
                    Self::MexicoCity => Mexico_City.from_utc_datetime(datetime),
                    Self::Miquelon => Miquelon.from_utc_datetime(datetime),
                    Self::Moncton => Moncton.from_utc_datetime(datetime),
                    Self::Monterrey => Monterrey.from_utc_datetime(datetime),
                    Self::Montevideo => Montevideo.from_utc_datetime(datetime),
                    Self::Montreal => Montreal.from_utc_datetime(datetime),
                    Self::Montserrat => Montserrat.from_utc_datetime(datetime),
                    Self::Nassau => Nassau.from_utc_datetime(datetime),
                    Self::NewYork => New_York.from_utc_datetime(datetime),
                    Self::Nipigon => Nipigon.from_utc_datetime(datetime),
                    Self::Nome => Nome.from_utc_datetime(datetime),
                    Self::Noronha => Noronha.from_utc_datetime(datetime),
                    Self::Ojinaga => Ojinaga.from_utc_datetime(datetime),
                    Self::Panama => Panama.from_utc_datetime(datetime),
                    Self::Pangnirtung => Pangnirtung.from_utc_datetime(datetime),
                    Self::Paramaribo => Paramaribo.from_utc_datetime(datetime),
                    Self::Phoenix => Phoenix.from_utc_datetime(datetime),
                    Self::PortOfSpain => Port_of_Spain.from_utc_datetime(datetime),
                    Self::PortAuPrince => PortauPrince.from_utc_datetime(datetime),
                    Self::PortoAcre => Porto_Acre.from_utc_datetime(datetime),
                    Self::PortoVelho => Porto_Velho.from_utc_datetime(datetime),
                    Self::PuertoRico => Puerto_Rico.from_utc_datetime(datetime),
                    Self::PuntaArenas => Punta_Arenas.from_utc_datetime(datetime),
                    Self::RainyRiver => Rainy_River.from_utc_datetime(datetime),
                    Self::RankinInlet => Rankin_Inlet.from_utc_datetime(datetime),
                    Self::Recife => Recife.from_utc_datetime(datetime),
                    Self::Regina => Regina.from_utc_datetime(datetime),
                    Self::Resolute => Resolute.from_utc_datetime(datetime),
                    Self::RioBranco => Rio_Branco.from_utc_datetime(datetime),
                    Self::Rosario => Rosario.from_utc_datetime(datetime),
                    Self::SantaIsabel => Santa_Isabel.from_utc_datetime(datetime),
                    Self::Santarem => Santarem.from_utc_datetime(datetime),
                    Self::Santiago => Santiago.from_utc_datetime(datetime),
                    Self::SantoDomingo => Santo_Domingo.from_utc_datetime(datetime),
                    Self::SaoPaulo => Sao_Paulo.from_utc_datetime(datetime),
                    Self::Scoresbysund => Scoresbysund.from_utc_datetime(datetime),
                    Self::Shiprock => Shiprock.from_utc_datetime(datetime),
                    Self::Sitka => Sitka.from_utc_datetime(datetime),
                    Self::StBarthelemy => St_Barthelemy.from_utc_datetime(datetime),
                    Self::StJohns => St_Johns.from_utc_datetime(datetime),
                    Self::StKitts => St_Kitts.from_utc_datetime(datetime),
                    Self::StLucia => St_Lucia.from_utc_datetime(datetime),
                    Self::StThomas => St_Thomas.from_utc_datetime(datetime),
                    Self::StVincent => St_Vincent.from_utc_datetime(datetime),
                    Self::SwiftCurrent => Swift_Current.from_utc_datetime(datetime),
                    Self::Tegucigalpa => Tegucigalpa.from_utc_datetime(datetime),
                    Self::Thule => Thule.from_utc_datetime(datetime),
                    Self::ThunderBay => Thunder_Bay.from_utc_datetime(datetime),
                    Self::Tijuana => Tijuana.from_utc_datetime(datetime),
                    Self::Toronto => Toronto.from_utc_datetime(datetime),
                    Self::Tortola => Tortola.from_utc_datetime(datetime),
                    Self::Vancouver => Vancouver.from_utc_datetime(datetime),
                    Self::Virgin => Virgin.from_utc_datetime(datetime),
                    Self::Whitehorse => Whitehorse.from_utc_datetime(datetime),
                    Self::Winnipeg => Winnipeg.from_utc_datetime(datetime),
                    Self::Yakutat => Yakutat.from_utc_datetime(datetime),
                    Self::Yellowknife => Yellowknife.from_utc_datetime(datetime),
                    Self::Argentina(_)
                    | Self::Indiana(_)
                    | Self::Kentucky(_)
                    | Self::NorthDakota(_) => unreachable!(),
                };
                p.timezone()
                    .offset_from_utc_date(&NaiveDate::from_ymd(
                        datetime.year(),
                        datetime.month(),
                        datetime.day(),
                    ))
                    .fix()
            }
        }
    }
}
#[derive(Debug, EnumString, Clone)]
#[non_exhaustive]
pub enum Argentina {
    BuenosAires,
    Catamarca,
    ComodRivadavia,
    Cordoba,
    Jujuy,
    LaRioja,
    Mendoza,
    RioGallegos,
    Salta,
    SanJuan,
    SanLuis,
    Tucuman,
    Ushuaia,
}
impl Argentina {
    pub(crate) fn try_from_path(p: &[&str]) -> Result<Self, Error> {
        if p.len() != 1 {
            return Err(Error::TooManyElements(p.len()));
        }
        match p[0] {
            "Buenos_Aires" => Ok(Self::BuenosAires),
            "La_Rioja" => Ok(Self::LaRioja),
            "Rio_Gallegos" => Ok(Self::RioGallegos),
            "San_Juan" => Ok(Self::SanJuan),
            "San_Luis" => Ok(Self::SanLuis),
            other => Self::from_str(other).map_err(|_| Error::WrongTimeZone(p[0].to_string())),
        }
    }
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        use chrono_tz::America::Argentina::*;
        let p = match self {
            Self::BuenosAires => Buenos_Aires.from_utc_datetime(datetime),
            Self::Catamarca => Catamarca.from_utc_datetime(datetime),
            Self::ComodRivadavia => ComodRivadavia.from_utc_datetime(datetime),
            Self::Cordoba => Cordoba.from_utc_datetime(datetime),
            Self::Jujuy => Jujuy.from_utc_datetime(datetime),
            Self::LaRioja => La_Rioja.from_utc_datetime(datetime),
            Self::Mendoza => Mendoza.from_utc_datetime(datetime),
            Self::RioGallegos => Rio_Gallegos.from_utc_datetime(datetime),
            Self::Salta => Salta.from_utc_datetime(datetime),
            Self::SanJuan => San_Juan.from_utc_datetime(datetime),
            Self::SanLuis => San_Luis.from_utc_datetime(datetime),
            Self::Tucuman => Tucuman.from_utc_datetime(datetime),
            Self::Ushuaia => Ushuaia.from_utc_datetime(datetime),
        };
        p.timezone()
            .offset_from_utc_date(&NaiveDate::from_ymd(
                datetime.year(),
                datetime.month(),
                datetime.day(),
            ))
            .fix()
    }
}
#[derive(Debug, EnumString, Clone)]
#[non_exhaustive]
pub enum Indiana {
    Indianapolis,
    Knox,
    Marengo,
    Petersburg,
    TellCity,
    Vevay,
    Vincennes,
    Winamac,
}
impl Indiana {
    pub(crate) fn try_from_path(p: &[&str]) -> Result<Self, Error> {
        if p.len() != 1 {
            return Err(Error::TooManyElements(p.len()));
        }
        match p[0] {
            "Tell_City" => Ok(Self::TellCity),
            other => Self::from_str(other).map_err(|_| Error::WrongTimeZone(p[0].to_string())),
        }
    }
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        use chrono_tz::America::Indiana::*;
        let p = match self {
            Self::Indianapolis => Indianapolis.from_utc_datetime(datetime),
            Self::Knox => Knox.from_utc_datetime(datetime),
            Self::Marengo => Marengo.from_utc_datetime(datetime),
            Self::Petersburg => Petersburg.from_utc_datetime(datetime),
            Self::TellCity => Tell_City.from_utc_datetime(datetime),
            Self::Vevay => Vevay.from_utc_datetime(datetime),
            Self::Vincennes => Vincennes.from_utc_datetime(datetime),
            Self::Winamac => Winamac.from_utc_datetime(datetime),
        };
        p.timezone()
            .offset_from_utc_date(&NaiveDate::from_ymd(
                datetime.year(),
                datetime.month(),
                datetime.day(),
            ))
            .fix()
    }
}
#[derive(Debug, EnumString, Clone)]
#[non_exhaustive]
pub enum Kentucky {
    Louisville,
    Monticello,
}
impl Kentucky {
    pub(crate) fn try_from_path(p: &[&str]) -> Result<Self, Error> {
        if p.len() != 1 {
            return Err(Error::TooManyElements(p.len()));
        }
        match p[0] {
            other => Self::from_str(other).map_err(|_| Error::WrongTimeZone(p[0].to_string())),
        }
    }
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        use chrono_tz::America::Kentucky::*;
        let p = match self {
            Self::Louisville => Louisville.from_utc_datetime(datetime),
            Self::Monticello => Monticello.from_utc_datetime(datetime),
        };
        p.timezone()
            .offset_from_utc_date(&NaiveDate::from_ymd(
                datetime.year(),
                datetime.month(),
                datetime.day(),
            ))
            .fix()
    }
}
#[derive(Debug, EnumString, Clone)]
#[non_exhaustive]
pub enum NorthDakota {
    Beulah,
    Center,
    NewSalem,
}
impl NorthDakota {
    pub(crate) fn try_from_path(p: &[&str]) -> Result<Self, Error> {
        if p.len() != 1 {
            return Err(Error::TooManyElements(p.len()));
        }
        match p[0] {
            "New_Salem" => Ok(Self::NewSalem),
            other => Self::from_str(other).map_err(|_| Error::WrongTimeZone(p[0].to_string())),
        }
    }
    pub(crate) fn get_tz(&self, datetime: &NaiveDateTime) -> FixedOffset {
        use chrono_tz::America::North_Dakota::*;
        let p = match self {
            Self::Beulah => Beulah.from_utc_datetime(datetime),
            Self::Center => Center.from_utc_datetime(datetime),
            Self::NewSalem => New_Salem.from_utc_datetime(datetime),
        };
        p.timezone()
            .offset_from_utc_date(&NaiveDate::from_ymd(
                datetime.year(),
                datetime.month(),
                datetime.day(),
            ))
            .fix()
    }
}