aboutsummaryrefslogtreecommitdiff
path: root/Enmarcha.Sources.CtagShuttle
diff options
context:
space:
mode:
Diffstat (limited to 'Enmarcha.Sources.CtagShuttle')
-rw-r--r--Enmarcha.Sources.CtagShuttle/CtagShuttleRealtimeEstimatesProvider.cs30
-rw-r--r--Enmarcha.Sources.CtagShuttle/Enmarcha.Sources.CtagShuttle.csproj9
-rw-r--r--Enmarcha.Sources.CtagShuttle/Status.cs46
3 files changed, 85 insertions, 0 deletions
diff --git a/Enmarcha.Sources.CtagShuttle/CtagShuttleRealtimeEstimatesProvider.cs b/Enmarcha.Sources.CtagShuttle/CtagShuttleRealtimeEstimatesProvider.cs
new file mode 100644
index 0000000..3ec0c6f
--- /dev/null
+++ b/Enmarcha.Sources.CtagShuttle/CtagShuttleRealtimeEstimatesProvider.cs
@@ -0,0 +1,30 @@
+using System.Net.Http.Json;
+
+namespace Enmarcha.Sources.CtagShuttle;
+
+public class CtagShuttleRealtimeEstimatesProvider
+{
+ private HttpClient _http;
+
+ public CtagShuttleRealtimeEstimatesProvider(HttpClient http)
+ {
+ _http = http;
+ }
+
+ public async Task<CtagShuttleStatus> GetShuttleStatus()
+ {
+ const string url = "https://shuttle.brain4mobility.com/status";
+
+ var response = await _http.GetAsync(url);
+ var status = await response.Content.ReadFromJsonAsync<CtagShuttleStatus>();
+
+ if (status is null)
+ {
+ throw new InvalidOperationException("Failed to retrieve shuttle status");
+ }
+
+ return status;
+ }
+
+}
+
diff --git a/Enmarcha.Sources.CtagShuttle/Enmarcha.Sources.CtagShuttle.csproj b/Enmarcha.Sources.CtagShuttle/Enmarcha.Sources.CtagShuttle.csproj
new file mode 100644
index 0000000..237d661
--- /dev/null
+++ b/Enmarcha.Sources.CtagShuttle/Enmarcha.Sources.CtagShuttle.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net10.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+</Project>
diff --git a/Enmarcha.Sources.CtagShuttle/Status.cs b/Enmarcha.Sources.CtagShuttle/Status.cs
new file mode 100644
index 0000000..ecf2da1
--- /dev/null
+++ b/Enmarcha.Sources.CtagShuttle/Status.cs
@@ -0,0 +1,46 @@
+using System.Text.Json.Serialization;
+
+namespace Enmarcha.Sources.CtagShuttle;
+
+public class CtagShuttleStatus
+{
+ [JsonPropertyName("status")] public required string StatusValue { get; set; }
+ [JsonPropertyName("lat")] public double Latitude { get; set; }
+ [JsonPropertyName("lng")] public double Longitude { get; set; }
+ [JsonPropertyName("last_position_at")] public required string LastPositionAtValue { get; set; }
+ [JsonPropertyName("free_seats")] public int FreeSeats { get; set; }
+
+ [JsonPropertyName("last_occupancy_at")]
+ public required string LastOccupancyAtValue { get; set; }
+
+ [JsonIgnore]
+ public Status Status => Status.Parse(StatusValue);
+
+ [JsonIgnore]
+ public DateTime LastPositionAt => DateTime.Parse(LastPositionAtValue);
+
+ [JsonIgnore]
+ public DateTime LastOccupancyAt => DateTime.Parse(LastOccupancyAtValue);
+}
+
+public enum Status
+{
+ Idle,
+ Operating
+}
+
+public static class StatusExtensions
+{
+ extension(Status)
+ {
+ public static Status Parse(string value)
+ {
+ return value switch
+ {
+ "idle" => Status.Idle,
+ "operating" => Status.Operating,
+ _ => throw new ArgumentException($"Invalid status value: {value}")
+ };
+ }
+ }
+}