diff options
Diffstat (limited to 'test-runner/src/main')
| -rw-r--r-- | test-runner/src/main/kotlin/org/terst/nav/data/model/GribFile.kt | 40 | ||||
| -rw-r--r-- | test-runner/src/main/kotlin/org/terst/nav/data/model/GribRegion.kt | 20 |
2 files changed, 60 insertions, 0 deletions
diff --git a/test-runner/src/main/kotlin/org/terst/nav/data/model/GribFile.kt b/test-runner/src/main/kotlin/org/terst/nav/data/model/GribFile.kt new file mode 100644 index 0000000..9d284b5 --- /dev/null +++ b/test-runner/src/main/kotlin/org/terst/nav/data/model/GribFile.kt @@ -0,0 +1,40 @@ +package org.terst.nav.data.model + +import java.time.Instant + +/** + * Metadata record for a locally-stored GRIB2 file. + * + * @param region The geographic region this file covers. + * @param modelRunTime When the NWP model run that produced this file started (UTC). + * @param forecastHours Number of forecast hours included in this file. + * @param downloadedAt Wall-clock time when the file was saved locally. + * @param filePath Absolute path to the GRIB2 file on the device filesystem. + * @param sizeBytes File size in bytes. + */ +data class GribFile( + val region: GribRegion, + val modelRunTime: Instant, + val forecastHours: Int, + val downloadedAt: Instant, + val filePath: String, + val sizeBytes: Long +) { + /** + * The wall-clock time at which this GRIB file's forecast data expires. + * Per design doc §6.3: valid until model run + forecast hours. + */ + fun validUntil(): Instant = modelRunTime.plusSeconds(forecastHours.toLong() * 3600) + + /** + * Returns true if the data has expired relative to [now]. + * Per design doc §6.3: stale after model run + forecast hour. + */ + fun isStale(now: Instant = Instant.now()): Boolean = now.isAfter(validUntil()) + + /** + * Age of the download in seconds. + */ + fun ageSeconds(now: Instant = Instant.now()): Long = + now.epochSecond - downloadedAt.epochSecond +} diff --git a/test-runner/src/main/kotlin/org/terst/nav/data/model/GribRegion.kt b/test-runner/src/main/kotlin/org/terst/nav/data/model/GribRegion.kt new file mode 100644 index 0000000..5e32d6c --- /dev/null +++ b/test-runner/src/main/kotlin/org/terst/nav/data/model/GribRegion.kt @@ -0,0 +1,20 @@ +package org.terst.nav.data.model + +/** + * Geographic bounding box used to identify a GRIB download region. + * @param name Human-readable region name (e.g. "North Atlantic", "English Channel") + */ +data class GribRegion( + val name: String, + val latMin: Double, + val latMax: Double, + val lonMin: Double, + val lonMax: Double +) { + /** True if [lat]/[lon] falls within this region's bounding box. */ + fun contains(lat: Double, lon: Double): Boolean = + lat in latMin..latMax && lon in lonMin..lonMax + + /** Area in square degrees (rough proxy for download size estimate). */ + fun areaDegrees(): Double = (latMax - latMin) * (lonMax - lonMin) +} |
