import 'package:json_annotation/json_annotation.dart'; part 'machine.g.dart'; enum MachineType { @JsonValue('Espresso') espresso, @JsonValue('Drip') drip, @JsonValue('Percolation') percolation, @JsonValue('French Press') frenchPress, @JsonValue('Cold Brew') coldBrew, @JsonValue('E61') e61, @JsonValue('Pod') pod, @JsonValue('Espresso Pod') espressoPod, @JsonValue('Grinder') grinder, } @JsonSerializable() class Portafilter { final String id; final String size; final String material; Portafilter({required this.id, required this.size, required this.material}); factory Portafilter.fromJson(Map json) => _$PortafilterFromJson(json); Map toJson() => _$PortafilterToJson(this); } @JsonSerializable() class Machine { final String id; final String manufacturer; final int year; final String model; final MachineType type; final bool steamWand; final String details; final bool isOwned; final double rating; final int popularity; final List portafilters; final Map specifications; Machine({ required this.id, required this.manufacturer, required this.year, required this.model, required this.type, required this.steamWand, required this.details, required this.isOwned, required this.rating, required this.popularity, required this.portafilters, required this.specifications, }); factory Machine.fromJson(Map json) => _$MachineFromJson(json); Map toJson() => _$MachineToJson(this); } @JsonSerializable() class EspressoMachine extends Machine { final String boilerType; final String capacity; final String? grinder; final String heatSourceDescription; final bool hopper; final bool isDosing; final int maxPressureBars; final bool pressureGaugeIncluded; final bool programmable; final bool usesLever; final int waterCapacity; final Portafilter? portafilter; EspressoMachine({ required super.id, required super.manufacturer, required super.year, required super.model, required super.type, required super.steamWand, required super.details, required super.isOwned, required super.rating, required super.popularity, required super.portafilters, required super.specifications, required this.boilerType, required this.capacity, this.grinder, required this.heatSourceDescription, required this.hopper, required this.isDosing, required this.maxPressureBars, required this.pressureGaugeIncluded, required this.programmable, required this.usesLever, required this.waterCapacity, this.portafilter, }); factory EspressoMachine.fromJson(Map json) => _$EspressoMachineFromJson(json); @override Map toJson() => _$EspressoMachineToJson(this); } @JsonSerializable() class DripCoffee extends Machine { final String brewerType; final bool caraffe; final String filterType; final bool programmable; DripCoffee({ required super.id, required super.manufacturer, required super.year, required super.model, required super.type, required super.steamWand, required super.details, required super.isOwned, required super.rating, required super.popularity, required super.portafilters, required super.specifications, required this.brewerType, required this.caraffe, required this.filterType, required this.programmable, }); factory DripCoffee.fromJson(Map json) => _$DripCoffeeFromJson(json); @override Map toJson() => _$DripCoffeeToJson(this); } @JsonSerializable() class Grinder { final String id; final String burrType; final int grindSettingsCount; Grinder({ required this.id, required this.burrType, required this.grindSettingsCount, }); factory Grinder.fromJson(Map json) => _$GrinderFromJson(json); Map toJson() => _$GrinderToJson(this); }