Skip to content

Commit 0f0a631

Browse files
committed
feat(apix): gfs endpoint api
1 parent f6865a2 commit 0f0a631

5 files changed

Lines changed: 644 additions & 2 deletions

File tree

.github/scripts/options.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ declare -A docs=(
6969
[forecast]="https://open-meteo.com/en/docs"
7070
[historical]="https://open-meteo.com/en/docs/historical-weather-api"
7171
[marine]="https://open-meteo.com/en/docs/marine-weather-api"
72+
[gfs]="https://open-meteo.com/en/docs/gfs-api"
7273
)
7374

7475
# should run in project root
@@ -81,12 +82,12 @@ for endpoint in "${!docs[@]}"; do
8182
done
8283

8384
name="hourly"
84-
for endpoint in airquality ecmwf forecast historical marine; do
85+
for endpoint in airquality ecmwf forecast historical marine gfs; do
8586
options
8687
done
8788

8889
name="daily"
89-
for endpoint in forecast historical marine; do
90+
for endpoint in forecast historical marine gfs; do
9091
options
9192
done
9293

lib/src/main/kotlin/com/openmeteo/apix/OpenMeteo.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import com.openmeteo.apix.elevation.Elevation
1616
import com.openmeteo.apix.forecast.Forecast
1717
import com.openmeteo.apix.geocoding.GeocodingGet
1818
import com.openmeteo.apix.geocoding.GeocodingSearch
19+
import com.openmeteo.apix.gfs.Gfs
20+
import kotlinx.serialization.SerialName
1921

2022
class OpenMeteo(
2123
override val latitude: Float = 0f,
@@ -26,6 +28,7 @@ class OpenMeteo(
2628
val forecast: Endpoint = Endpoint(Forecast.context),
2729
val geocodingGet: Endpoint = Endpoint(GeocodingGet.context),
2830
val geocodingSearch: Endpoint = Endpoint(GeocodingSearch.context),
31+
val gfs: Endpoint = Endpoint(Gfs.context),
2932
) : QueryCoordinates {
3033

3134
constructor(coordinates: Pair<Float, Float>) : this(
@@ -59,6 +62,9 @@ class OpenMeteo(
5962
operator fun invoke(query: GeocodingSearch.Query) =
6063
geocodingSearch.query<GeocodingSearch.Response>(query)
6164

65+
operator fun invoke(query: Gfs.Query) =
66+
gfs.query<Gfs.Response>(query)
67+
6268
fun airQuality(
6369
latitude: Float = this.latitude,
6470
longitude: Float = this.longitude,
@@ -116,4 +122,22 @@ class OpenMeteo(
116122
language: String? = null,
117123
) = invoke(GeocodingSearch.Query(name, count, language))
118124

125+
fun gfs(
126+
latitude: Float,
127+
longitude: Float,
128+
hourly: Iterable<com.openmeteo.apix.gfs.Hourly>? = null,
129+
daily: Iterable<QueryDaily.Options>?,
130+
currentWeather: Boolean? = null,
131+
temperatureUnit: TemperatureUnit? = null,
132+
windSpeedUnit: WindSpeedUnit? = null,
133+
precipitationUnit: PrecipitationUnit? = null,
134+
timeZone: TimeZone? = null,
135+
startDate: Date? = null,
136+
endDate: Date? = null,
137+
pastDays: Int? = null,
138+
forecastDays: Int? = null,
139+
) = invoke(Gfs.Query(latitude, longitude, hourly, daily, currentWeather,
140+
temperatureUnit, windSpeedUnit, precipitationUnit, timeZone, startDate,
141+
endDate, pastDays, forecastDays))
142+
119143
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.openmeteo.apix.gfs
2+
3+
import com.openmeteo.apix.common.query.QueryDaily
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
enum class Daily : QueryDaily.Options {
9+
@SerialName("weathercode")
10+
Weathercode,
11+
@SerialName("temperature_2m_max")
12+
Temperature2mMax,
13+
@SerialName("temperature_2m_min")
14+
Temperature2mMin,
15+
@SerialName("apparent_temperature_max")
16+
ApparentTemperatureMax,
17+
@SerialName("apparent_temperature_min")
18+
ApparentTemperatureMin,
19+
@SerialName("sunrise")
20+
Sunrise,
21+
@SerialName("sunset")
22+
Sunset,
23+
@SerialName("precipitation_sum")
24+
PrecipitationSum,
25+
@SerialName("rain_sum")
26+
RainSum,
27+
@SerialName("showers_sum")
28+
ShowersSum,
29+
@SerialName("snowfall_sum")
30+
SnowfallSum,
31+
@SerialName("precipitation_hours")
32+
PrecipitationHours,
33+
@SerialName("windspeed_10m_max")
34+
Windspeed10mMax,
35+
@SerialName("windgusts_10m_max")
36+
Windgusts10mMax,
37+
@SerialName("winddirection_10m_dominant")
38+
Winddirection10mDominant,
39+
@SerialName("shortwave_radiation_sum")
40+
ShortwaveRadiationSum,
41+
@SerialName("et0_fao_evapotranspiration")
42+
Et0FaoEvapotranspiration,
43+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.openmeteo.apix.gfs
2+
3+
import com.openmeteo.apix.common.query.*
4+
import com.openmeteo.apix.common.response.*
5+
import com.openmeteo.apix.common.response.ResponseCurrentWeather.CurrentWeather
6+
import com.openmeteo.apix.common.time.Date
7+
import com.openmeteo.apix.common.time.TimeZone
8+
import com.openmeteo.apix.common.units.PrecipitationUnit
9+
import com.openmeteo.apix.common.units.TemperatureUnit
10+
import com.openmeteo.apix.common.units.Unit
11+
import com.openmeteo.apix.common.units.WindSpeedUnit
12+
import kotlinx.serialization.SerialName
13+
import kotlinx.serialization.Serializable
14+
import java.net.URL
15+
16+
object Gfs {
17+
18+
val context = URL("https://api.open-meteo.com/v1/gfs")
19+
20+
class Query(
21+
override val latitude: Float,
22+
override val longitude: Float,
23+
override val hourly: Iterable<Hourly>? = null,
24+
override val daily: Iterable<QueryDaily.Options>?,
25+
override val currentWeather: Boolean? = null,
26+
val temperatureUnit: TemperatureUnit? = null,
27+
val windSpeedUnit: WindSpeedUnit? = null,
28+
val precipitationUnit: PrecipitationUnit? = null,
29+
override val timeZone: TimeZone? = null,
30+
override val startDate: Date? = null,
31+
override val endDate: Date? = null,
32+
override val pastDays: Int? = null,
33+
@SerialName("forecast_days")
34+
val forecastDays: Int? = null,
35+
) : QueryCoordinates,
36+
QueryHourly,
37+
QueryDaily,
38+
QueryCurrentWeather,
39+
QueryDateRange
40+
41+
@Serializable
42+
class Response(
43+
override val latitude: Float,
44+
override val longitude: Float,
45+
@SerialName("utc_offset_seconds")
46+
override val utcOffsetSeconds: Int,
47+
@SerialName("timezone")
48+
override val timeZone: TimeZone,
49+
@SerialName("timezone_abbreviation")
50+
override val timeZoneAbbreviation: String,
51+
@SerialName("hourly_units")
52+
override val hourlyUnits: Map<Hourly, Unit>? = null,
53+
@SerialName("hourly")
54+
override val hourlyValues: Map<Hourly, Array<Double?>>? = null,
55+
@SerialName("daily_units")
56+
override val dailyUnits: Map<Daily, Unit>?,
57+
@SerialName("daily")
58+
override val dailyValues: Map<Daily, Array<Double?>>?,
59+
@SerialName("generationtime_ms")
60+
override val generationTimeMs: Float,
61+
@SerialName("current_weather")
62+
override val currentWeather: CurrentWeather,
63+
) : ResponseCoordinates,
64+
ResponseHourly<Hourly>,
65+
ResponseDaily<Daily>,
66+
ResponseCurrentWeather,
67+
ResponseGenerationTimed
68+
69+
}

0 commit comments

Comments
 (0)