import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'query.freezed.dart'; part 'query.g.dart'; enum SortDirection { asc, desc, } enum AlbumsColumn { name, created, year, starred, } enum ArtistsColumn { name, starred, albumCount, } enum SongsColumn { title, starred, disc, track, album, artist, albumArtist, } @freezed abstract class SortingTerm with _$SortingTerm { const factory SortingTerm.albums({ required SortDirection dir, required AlbumsColumn by, }) = AlbumsSortingTerm; const factory SortingTerm.artists({ required SortDirection dir, required ArtistsColumn by, }) = ArtistsSortingTerm; const factory SortingTerm.songs({ required SortDirection dir, required SongsColumn by, }) = SongsSortingTerm; factory SortingTerm.fromJson(Map json) => _$SortingTermFromJson(json); } @freezed abstract class AlbumsQuery with _$AlbumsQuery { const factory AlbumsQuery({ required int sourceId, @Default(IListConst([])) IList filter, required IList sort, int? limit, int? offset, }) = _AlbumsQuery; factory AlbumsQuery.fromJson(Map json) => _$AlbumsQueryFromJson(json); } @freezed abstract class AlbumsFilter with _$AlbumsFilter { const factory AlbumsFilter.artistId(String artistId) = AlbumsFilterArtistId; const factory AlbumsFilter.yearEquals(int year) = AlbumsFilterYearEquals; factory AlbumsFilter.fromJson(Map json) => _$AlbumsFilterFromJson(json); } @freezed abstract class ArtistsQuery with _$ArtistsQuery { const factory ArtistsQuery({ required int sourceId, @Default(IListConst([])) IList filter, required IList sort, int? limit, int? offset, }) = _ArtistsQuery; factory ArtistsQuery.fromJson(Map json) => _$ArtistsQueryFromJson(json); } @freezed abstract class ArtistsFilter with _$ArtistsFilter { const factory ArtistsFilter.nameSearch(String name) = ArtistsFilterNameSearch; const factory ArtistsFilter.starred(bool starred) = ArtistsFilterStarred; factory ArtistsFilter.fromJson(Map json) => _$ArtistsFilterFromJson(json); } @freezed abstract class SongsQuery with _$SongsQuery { const factory SongsQuery({ required int sourceId, @Default(IListConst([])) IList filter, required IList sort, int? limit, int? offset, }) = _SongsQuery; factory SongsQuery.fromJson(Map json) => _$SongsQueryFromJson(json); } @freezed abstract class SongsFilter with _$SongsFilter { const factory SongsFilter.albumId(String albumId) = SongsFilterAlbumId; const factory SongsFilter.playlistId(String playlistId) = SongsFilterPlaylistId; factory SongsFilter.fromJson(Map json) => _$SongsFilterFromJson(json); }