Start Rust rewrite

* Implement downloading and caching
* Write some tests
This commit is contained in:
Jules 2023-01-15 20:29:01 +01:00
parent 317f32565b
commit 1647ddef77
11 changed files with 2815 additions and 1 deletions

17
.idea/dataSources.xml generated Normal file
View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="test" uuid="2de274d0-0fd4-4132-93aa-2af5c71e03cf">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:C:\Users\Jules\GitHub\ics-fusion\test.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
<libraries>
<library>
<url>file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.39.2/sqlite-jdbc-3.39.2.jar</url>
</library>
</libraries>
</data-source>
</component>
</project>

6
.idea/ics-fusion.iml generated
View file

@ -2,7 +2,11 @@
<module type="JAVA_MODULE" version="4"> <module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true"> <component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/resources/test" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>

9
.idea/misc.xml generated Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PWA">
<option name="wasEnabledAtLeastOnce" value="true" />
</component>
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

1444
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

17
Cargo.toml Normal file
View file

@ -0,0 +1,17 @@
[package]
name = "ics-fusion"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde_json = "1.0.91"
url = "2.3.1"
reqwest = { version = "0.11.13", features = ["blocking"] }
icalendar = "0.15.1"
sha2 = "0.10.6"
chrono = "0.4.23"
rusqlite = { version = "0.28.0", features = ["bundled"] }
env_logger = "0.10.0"
log = "0.4.17"

971
resources/test/belgium.ics Normal file
View file

@ -0,0 +1,971 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Office Holidays Ltd.//EN
X-WR-CALNAME:Belgium Holidays
X-WR-CALDESC:Public Holidays in Belgium. Provided by http://www.officeholidays.com
REFRESH-INTERVAL;VALUE=DURATION:PT48H
X-PUBLISHED-TTL:PT48H
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-01-01BE415regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: New Year's Day is a public holiday in all countries that observe the Gregorian calendar, with the exception of Israel\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/international-new-years-day
DTSTART;VALUE=DATE:20230101
DTEND;VALUE=DATE:20230102
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:New Year's Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-01-06BE278regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: A major Christian celebration, Epiphany is celebrated on January 6th and commemorates the presentation of the infant Jesus to the Magi, or three wise men. In some countries, it may be known as Three Kings Day.\n\nNot a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/epiphany
DTSTART;VALUE=DATE:20230106
DTEND;VALUE=DATE:20230107
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Three Kings' Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-04-09BE265regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Easter Sunday is the most important date in the Christian church. In the bible, it is the day when Mary Magdalene found that an empty tomb in the cave in which Jesus had been placed.\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/easter-sunday
DTSTART;VALUE=DATE:20230409
DTEND;VALUE=DATE:20230410
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Easter Sunday
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-04-10BE263regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Easter is probably the most important holiday of the Christian year, celebrating the Resurrection of Jesus\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/easter-monday
DTSTART;VALUE=DATE:20230410
DTEND;VALUE=DATE:20230411
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Easter Monday
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-05-01BE475regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: This holiday is most commonly associated as a commemoration of the achievements of the labour movement\n\nInternational Workers' Day\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/labour-day
DTSTART;VALUE=DATE:20230501
DTEND;VALUE=DATE:20230502
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Labour Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-05-14BE563regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Mother's Day is celebrated across the world, in more than 50 countries, though not all countries celebrate it on the same day\n\n2nd Sunday in May\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/mothers-day
DTSTART;VALUE=DATE:20230514
DTEND;VALUE=DATE:20230515
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Mother's Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-05-18BE37regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: This day observes the departure of Jesus from earth after his resurrection. It is perhaps the earliest observed celebration in Christianity.\n\n39 days after Easter Sunday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/ascension-day
DTSTART;VALUE=DATE:20230518
DTEND;VALUE=DATE:20230519
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20220504T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Ascension Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-05-19BE2854regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Banks are closed on the Friday after Ascension Day in Belgium\n\nBanks are closed\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/ascension-friday
DTSTART;VALUE=DATE:20230519
DTEND;VALUE=DATE:20230520
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Bank Holiday (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-05-28BE1012regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Celebrates the gift of the Holy Spirit. It is celebrated on the seventh Sunday after Easter\n\n50 Days after Easter\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/pentecost-sunday
DTSTART;VALUE=DATE:20230528
DTEND;VALUE=DATE:20230529
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20221129T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Pentecost Sunday (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-05-29BE927regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Commemorates the coming of the Holy Spirit in the form of flames to the Apostles.\n\n7th Monday after Easter\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/whit-monday
DTSTART;VALUE=DATE:20230529
DTEND;VALUE=DATE:20230530
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20220620T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Pentecost Monday
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-06-10BE290regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Not a public holiday. Father's Day is a celebration that honours the role of fathers\n\n2nd Sunday in June. Not a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/fathers-day
DTSTART;VALUE=DATE:20230610
DTEND;VALUE=DATE:20230611
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Father's Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-07-21BE82regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Independence Day celebrates the separation of Belgium from the Netherlands in 1831\n\nNational Day\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/belgium-independence-day
DTSTART;VALUE=DATE:20230721
DTEND;VALUE=DATE:20230722
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Independence Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-08-15BE42regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: The Feast of the Assumption is the principal feast of the Blessed Virgin, the mother of Jesus Christ\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/assumption-day
DTSTART;VALUE=DATE:20230815
DTEND;VALUE=DATE:20230816
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Assumption Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-09-27BE325regregion@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: On 24 June 1975, the date of 27 September was selected by the French Community as French Community Day. It was first celebrated later that same year\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/french-community-holiday
DTSTART;VALUE=DATE:20230927
DTEND;VALUE=DATE:20230928
DTSTAMP:20080101T000000Z
LOCATION:Brabant wallon, Hainaut, Liège, Luxemburg, Namur
PRIORITY:5
LAST-MODIFIED:20191229T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:French Community Holiday (Regional Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-11-01BE9regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Pope Boniface IV dedicated the day as a holiday to honour the Blessed Virgin Mary and all martyrs\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/all-saints-day
DTSTART;VALUE=DATE:20231101
DTEND;VALUE=DATE:20231102
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:All Saints' Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-11-02BE10regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Dedicated to the remembrance of the departed. All Souls' Day follows All Saints' Day.\n\nNot a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/all-souls-day
DTSTART;VALUE=DATE:20231102
DTEND;VALUE=DATE:20231103
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:All Souls' Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-11-11BE705regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Observed on 11th November to recall the end of World War I on that date in 1918 and honor the veterans of both World Wars.\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/remembrance-day
DTSTART;VALUE=DATE:20231111
DTEND;VALUE=DATE:20231112
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20211022T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Armistice Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-11-15BE-WLG337regregion@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Day of the German-speaking Community of Belgium\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/liege/german-community-day
DTSTART;VALUE=DATE:20231115
DTEND;VALUE=DATE:20231116
DTSTAMP:20080101T000000Z
LOCATION:Liège
PRIORITY:5
LAST-MODIFIED:20191229T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:German Community Day (Regional Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-12-06BE298regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: A day when many children across Europe receive gifts in honour of Saint Nicholas\n\nNot a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/feast-of-st-nicholas
DTSTART;VALUE=DATE:20231206
DTEND;VALUE=DATE:20231207
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Feast of St. Nicholas (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2023-12-25BE181regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Christmas celebrates the Nativity of Jesus which according to tradition took place on December 25th 1 BC\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/christmas-day
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Christmas Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-01-01BE415regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: New Year's Day is a public holiday in all countries that observe the Gregorian calendar, with the exception of Israel\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/international-new-years-day
DTSTART;VALUE=DATE:20240101
DTEND;VALUE=DATE:20240102
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:New Year's Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-01-06BE278regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: A major Christian celebration, Epiphany is celebrated on January 6th and commemorates the presentation of the infant Jesus to the Magi, or three wise men. In some countries, it may be known as Three Kings Day.\n\nNot a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/epiphany
DTSTART;VALUE=DATE:20240106
DTEND;VALUE=DATE:20240107
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Three Kings' Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-03-31BE265regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Easter Sunday is the most important date in the Christian church. In the bible, it is the day when Mary Magdalene found that an empty tomb in the cave in which Jesus had been placed.\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/easter-sunday
DTSTART;VALUE=DATE:20240331
DTEND;VALUE=DATE:20240401
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Easter Sunday
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-04-01BE263regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Easter is probably the most important holiday of the Christian year, celebrating the Resurrection of Jesus\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/easter-monday
DTSTART;VALUE=DATE:20240401
DTEND;VALUE=DATE:20240402
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Easter Monday
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-05-01BE475regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: This holiday is most commonly associated as a commemoration of the achievements of the labour movement\n\nInternational Workers' Day\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/labour-day
DTSTART;VALUE=DATE:20240501
DTEND;VALUE=DATE:20240502
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Labour Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-05-09BE37regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: This day observes the departure of Jesus from earth after his resurrection. It is perhaps the earliest observed celebration in Christianity.\n\n39 days after Easter Sunday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/ascension-day
DTSTART;VALUE=DATE:20240509
DTEND;VALUE=DATE:20240510
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20220504T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Ascension Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-05-10BE2854regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Banks are closed on the Friday after Ascension Day in Belgium\n\nBanks are closed\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/ascension-friday
DTSTART;VALUE=DATE:20240510
DTEND;VALUE=DATE:20240511
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Bank Holiday (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-05-12BE563regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Mother's Day is celebrated across the world, in more than 50 countries, though not all countries celebrate it on the same day\n\n2nd Sunday in May\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/mothers-day
DTSTART;VALUE=DATE:20240512
DTEND;VALUE=DATE:20240513
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Mother's Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-05-19BE1012regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Celebrates the gift of the Holy Spirit. It is celebrated on the seventh Sunday after Easter\n\n50 Days after Easter\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/pentecost-sunday
DTSTART;VALUE=DATE:20240519
DTEND;VALUE=DATE:20240520
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20221129T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Pentecost Sunday (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-05-20BE927regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Commemorates the coming of the Holy Spirit in the form of flames to the Apostles.\n\n7th Monday after Easter\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/whit-monday
DTSTART;VALUE=DATE:20240520
DTEND;VALUE=DATE:20240521
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20220620T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Pentecost Monday
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-06-09BE290regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Not a public holiday. Father's Day is a celebration that honours the role of fathers\n\n2nd Sunday in June. Not a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/fathers-day
DTSTART;VALUE=DATE:20240609
DTEND;VALUE=DATE:20240610
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Father's Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-07-21BE82regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Independence Day celebrates the separation of Belgium from the Netherlands in 1831\n\nNational Day\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/belgium-independence-day
DTSTART;VALUE=DATE:20240721
DTEND;VALUE=DATE:20240722
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Independence Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-08-15BE42regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: The Feast of the Assumption is the principal feast of the Blessed Virgin, the mother of Jesus Christ\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/assumption-day
DTSTART;VALUE=DATE:20240815
DTEND;VALUE=DATE:20240816
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Assumption Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-09-27BE325regregion@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: On 24 June 1975, the date of 27 September was selected by the French Community as French Community Day. It was first celebrated later that same year\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/french-community-holiday
DTSTART;VALUE=DATE:20240927
DTEND;VALUE=DATE:20240928
DTSTAMP:20080101T000000Z
LOCATION:Brabant wallon, Hainaut, Liège, Luxemburg, Namur
PRIORITY:5
LAST-MODIFIED:20191229T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:French Community Holiday (Regional Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-11-01BE9regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Pope Boniface IV dedicated the day as a holiday to honour the Blessed Virgin Mary and all martyrs\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/all-saints-day
DTSTART;VALUE=DATE:20241101
DTEND;VALUE=DATE:20241102
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:All Saints' Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-11-02BE10regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Dedicated to the remembrance of the departed. All Souls' Day follows All Saints' Day.\n\nNot a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/all-souls-day
DTSTART;VALUE=DATE:20241102
DTEND;VALUE=DATE:20241103
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:All Souls' Day (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-11-11BE705regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Observed on 11th November to recall the end of World War I on that date in 1918 and honor the veterans of both World Wars.\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/remembrance-day
DTSTART;VALUE=DATE:20241111
DTEND;VALUE=DATE:20241112
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20211022T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Armistice Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-11-15BE-WLG337regregion@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Day of the German-speaking Community of Belgium\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/liege/german-community-day
DTSTART;VALUE=DATE:20241115
DTEND;VALUE=DATE:20241116
DTSTAMP:20080101T000000Z
LOCATION:Liège
PRIORITY:5
LAST-MODIFIED:20191229T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:German Community Day (Regional Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-12-06BE298regnap@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: A day when many children across Europe receive gifts in honour of Saint Nicholas\n\nNot a public holiday\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/feast-of-st-nicholas
DTSTART;VALUE=DATE:20241206
DTEND;VALUE=DATE:20241207
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Feast of St. Nicholas (Not a Public Holiday)
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
BEGIN:VEVENT
CLASS:PUBLIC
UID:2024-12-25BE181regcountry@www.officeholidays.com
CREATED:20230114T111157Z
DESCRIPTION: Christmas celebrates the Nativity of Jesus which according to tradition took place on December 25th 1 BC\n\n\n\nInformation provided by www.officeholidays.com
URL:https://www.officeholidays.com/holidays/belgium/christmas-day
DTSTART;VALUE=DATE:20241225
DTEND;VALUE=DATE:20241226
DTSTAMP:20080101T000000Z
LOCATION:Belgium
PRIORITY:5
LAST-MODIFIED:20210707T000000Z
SEQUENCE:1
SUMMARY;LANGUAGE=en-us:Christmas Day
TRANSP:OPAQUE
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
X-MS-OLK-CONFTYPE:0
END:VEVENT
END:VCALENDAR

148
src/caching.rs Normal file
View file

@ -0,0 +1,148 @@
use chrono::{DateTime, Utc};
use icalendar::{Calendar, parser};
use rusqlite::{Connection, Error, params, Rows, Statement};
#[cfg(not(test))]
use log::{debug, info, warn};
#[cfg(test)]
use std::{println as debug, println as warn, println as info};
use crate::fetcher::{Remote};
struct CacheEntry {
hash: String,
update_time: Option<String>,
calendar: Option<String>,
}
pub struct CachedRemote {
cache_delay: Option<u32>,
remote: Remote,
cache_db: Connection,
}
impl CachedRemote {
pub fn cache(&self) -> Result<(), Error> {
debug!("Start caching of {:?}", self.remote);
if self.cache_delay.is_none() || self.remote.is_local() {
debug!("No need to cache {:?}", self.remote);
return Ok(());
}
self.force_cache()
}
pub fn force_cache(&self) -> Result<(), Error> {
let entry = CacheEntry {
hash: self.remote.hash(),
update_time: Some(Utc::now().to_rfc3339()),
calendar: match self.remote.get() {
Some(cal) => Some(parser::unfold(&cal.to_string())),
None => None,
},
};
self.cache_db.execute("REPLACE INTO cache (hash, update_time, calendar) values (?1, ?2, ?3);",
params![&entry.hash, &entry.update_time, &entry.calendar])?;
debug!("Cached {:?}", self.remote);
Ok(())
}
pub fn get_from_cache(&self) -> Option<Calendar> {
info!("Getting {:?} from cache", self.remote);
let mut statement: Statement;
if let Ok(stmt) = self.cache_db.prepare("SELECT calendar FROM cache where hash = ?"){
statement = stmt;
} else {
warn!("Could not prepare statement");
return None;
}
let mut rows: Rows;
if let Ok(rows_ok) = statement.query([self.remote.hash()]) {
rows = rows_ok;
} else {
warn!("Could not get a row from the query");
return None;
}
let cal_str: String;
if let Ok(Some(r)) = rows.next(){
if let Ok(s) = r.get(0) {
cal_str = s;
} else {
return None
}
} else {
warn!("No result from query");
return None;
}
if let Ok(cal) = parser::read_calendar(&cal_str) {
debug!("Returned cached from {:?}", self.remote);
debug!("{}", cal);
return Some(Calendar::from(cal));
}
warn!("Unable to parse calendar from cache");
None
}
pub fn get(&self) -> Option<Calendar> {
if self.cache_delay.is_none() || self.remote.is_local() {
return self.remote.get();
}
if let Some(cal) = self.get_from_cache() {
return Some(cal);
}
self.remote.get()
}
}
fn create_cache(path: Option<String>) -> Result<Connection, Error> {
let conn = match path {
Some(path) => Connection::open(path)?,
None => Connection::open_in_memory()?,
};
conn.execute(r#"
CREATE TABLE IF NOT EXISTS cache (
hash TEXT PRIMARY KEY,
update_time TEXT,
calendar BLOB
);"#, ())?;
Ok(conn)
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn cache_calendar() {
env_logger::init();
let db = create_cache(Some(String::from("test.db"))).unwrap();
let cached_remote = CachedRemote {
cache_delay: Some(10),
remote: Remote::new("resources/test/belgium.ics"),
cache_db: db,
};
debug!("Test in progress");
cached_remote.force_cache().unwrap();
let from_cache = cached_remote.get_from_cache().unwrap();
let from_remote = cached_remote.remote.get().unwrap();
assert_eq!(from_remote, from_cache);
}
}

41
src/config.rs Normal file
View file

@ -0,0 +1,41 @@
use std::{fs, io};
use std::path::{Path, PathBuf};
use url::Url;
struct Config {
directory: Box<Path>,
}
fn list_files(directory: &Path) -> Result<Vec<PathBuf>, io::Error> {
Ok(fs::read_dir(directory)?
.into_iter()
.filter(|r| r.is_ok()) // Get rid of Err variants for Result<DirEntry>
.map(|r| r.unwrap().path()) // This is safe, since we only have the Ok variants
.filter(|r| r.is_file()) // Filter to keep only files
.collect())
}
fn parse_config(directory: &str) -> Result<Config, String> {
let files = list_files(Path::new(directory))
.expect("unable to list files in the configuration directory");
for file in files {
println!("{:?}", file.display());
}
Ok(Config { directory: Box::from(Path::new("")) })
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn parsing_config() {
parse_config("resources/test").unwrap();
}
}

144
src/fetcher.rs Normal file
View file

@ -0,0 +1,144 @@
use std::fs;
use std::path::Path;
use url::Url;
use icalendar::{Calendar, parser};
use sha2::{Sha256, Digest};
use sha2::digest::FixedOutput;
#[cfg(not(test))]
use log::{debug, info, warn};
#[cfg(test)]
use std::{println as debug, println as warn, println as info};
#[derive(Debug)]
pub struct Remote {
location: Location,
}
#[derive(Debug)]
pub enum Location {
Online(Url),
Local(Box<Path>),
}
impl Remote {
pub fn new(location: &str) -> Remote {
let location = match Url::parse(location) {
Ok(url) => Location::Online(url),
Err(_) => Location::Local(Box::from(Path::new(location)))
};
Remote {location}
}
pub fn is_local(&self) -> bool {
match &self.location {
Location::Online(_) => false,
Location::Local(_) => true,
}
}
pub fn hash(&self) -> String {
let path = match &self.location {
Location::Online(url) => url.to_string(),
Location::Local(path) => String::from(path.to_str().unwrap_or("")),
};
let mut hasher = Sha256::new();
hasher.update(path);
format!("{:x}", hasher.finalize_fixed())
}
pub fn get(&self) -> Option<Calendar> {
debug!("Getting ics from {:?}", self.location);
let content = match &self.location {
Location::Online(url) => {
match get_url_content(url.to_string()) {
Ok(content) => Some(content),
Err(_) => None,
}
}
Location::Local(path) => {
match fs::read_to_string(path) {
Ok(content) => Some(content),
Err(_) => None,
}
}
};
if let Some(content) = content {
if let Ok(cal) = parser::read_calendar(&content) {
return Some(Calendar::from(cal));
}
}
None
}
}
fn get_url_content(url: String) -> Result<String, reqwest::Error> {
let content = reqwest::blocking::get(url)?
.text()?;
Ok(content)
}
#[cfg(test)]
mod test {
use std::path::Path;
use super::*;
#[test]
fn get_ics_from_file() {
let remote = Remote{
location: Location::Local(Box::from(Path::new("resources/test/belgium.ics"))),
};
let cal = remote.get();
assert!(cal.is_some());
let cal = cal.unwrap();
// Calendar has 40 events
assert_eq!(cal.len(), 40);
assert_eq!(cal.get_name().unwrap(), "Belgium Holidays");
}
#[test]
fn cannot_parse_calendar() {
let remote = Remote {
location: Location::Online(Url::parse("https://example.com/").unwrap()),
};
let cal = remote.get();
if let Some(cal) = cal {
assert_eq!(cal.len(), 0);
}
}
#[test]
fn hash_test() {
let remote = Remote {
location: Location::Local(Box::from(Path::new("file.ics"))),
};
let remote1 = Remote {
location: Location::Local(Box::from(Path::new("file.ics"))),
};
assert_eq!(remote.hash(), remote1.hash())
}
}

18
src/lib.rs Normal file
View file

@ -0,0 +1,18 @@
mod config;
mod fetcher;
mod caching;
pub fn add(left: usize, right: usize) -> usize {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}

1
src/main.rs Normal file
View file

@ -0,0 +1 @@
pub fn main() {}