diff --git a/.vscode/settings.json b/.vscode/settings.json index 69c80bb3..898f5f2e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -30,5 +30,8 @@ "README.md": "LICENSE,CODE_OF_CONDUCT.md,CONTRIBUTING.md,SECURITY.md,CONTRIBUTION.md,CHANGELOG.md,PRIVACY_POLICY.md", "*.dart": "${capture}.g.dart,${capture}.freezed.dart" }, - "dart.flutterSdkPath": ".fvm/versions/3.35.2" + "dart.flutterSdkPath": ".fvm/versions/3.35.2", + "rust-analyzer.files.exclude": [ + "rust/src/frb_generated.rs" + ] } \ No newline at end of file diff --git a/flutter_rust_bridge.yaml b/flutter_rust_bridge.yaml index e15ed916..88390182 100644 --- a/flutter_rust_bridge.yaml +++ b/flutter_rust_bridge.yaml @@ -1,3 +1,7 @@ rust_input: crate::api rust_root: rust/ -dart_output: lib/src/rust \ No newline at end of file +dart_output: lib/src/rust +web: false +enable_lifetime: true +rust_preamble: | + use tokio::sync::mpsc::Sender; diff --git a/lib/collections/routes.gr.dart b/lib/collections/routes.gr.dart index 99d8b92d..f5ff24bf 100644 --- a/lib/collections/routes.gr.dart +++ b/lib/collections/routes.gr.dart @@ -60,7 +60,7 @@ import 'package:spotube/pages/track/track.dart' as _i35; /// [_i1.AboutSpotubePage] class AboutSpotubeRoute extends _i41.PageRouteInfo { const AboutSpotubeRoute({List<_i41.PageRouteInfo>? children}) - : super(AboutSpotubeRoute.name, initialChildren: children); + : super(AboutSpotubeRoute.name, initialChildren: children); static const String name = 'AboutSpotubeRoute'; @@ -81,11 +81,11 @@ class AlbumRoute extends _i41.PageRouteInfo { required _i43.SpotubeSimpleAlbumObject album, List<_i41.PageRouteInfo>? children, }) : super( - AlbumRoute.name, - args: AlbumRouteArgs(key: key, id: id, album: album), - rawPathParams: {'id': id}, - initialChildren: children, - ); + AlbumRoute.name, + args: AlbumRouteArgs(key: key, id: id, album: album), + rawPathParams: {'id': id}, + initialChildren: children, + ); static const String name = 'AlbumRoute'; @@ -121,11 +121,11 @@ class ArtistRoute extends _i41.PageRouteInfo { _i42.Key? key, List<_i41.PageRouteInfo>? children, }) : super( - ArtistRoute.name, - args: ArtistRouteArgs(artistId: artistId, key: key), - rawPathParams: {'id': artistId}, - initialChildren: children, - ); + ArtistRoute.name, + args: ArtistRouteArgs(artistId: artistId, key: key), + rawPathParams: {'id': artistId}, + initialChildren: children, + ); static const String name = 'ArtistRoute'; @@ -158,7 +158,7 @@ class ArtistRouteArgs { /// [_i4.BlackListPage] class BlackListRoute extends _i41.PageRouteInfo { const BlackListRoute({List<_i41.PageRouteInfo>? children}) - : super(BlackListRoute.name, initialChildren: children); + : super(BlackListRoute.name, initialChildren: children); static const String name = 'BlackListRoute'; @@ -174,7 +174,7 @@ class BlackListRoute extends _i41.PageRouteInfo { /// [_i5.ConnectControlPage] class ConnectControlRoute extends _i41.PageRouteInfo { const ConnectControlRoute({List<_i41.PageRouteInfo>? children}) - : super(ConnectControlRoute.name, initialChildren: children); + : super(ConnectControlRoute.name, initialChildren: children); static const String name = 'ConnectControlRoute'; @@ -190,7 +190,7 @@ class ConnectControlRoute extends _i41.PageRouteInfo { /// [_i6.ConnectPage] class ConnectRoute extends _i41.PageRouteInfo { const ConnectRoute({List<_i41.PageRouteInfo>? children}) - : super(ConnectRoute.name, initialChildren: children); + : super(ConnectRoute.name, initialChildren: children); static const String name = 'ConnectRoute'; @@ -206,7 +206,7 @@ class ConnectRoute extends _i41.PageRouteInfo { /// [_i7.GettingStartedPage] class GettingStartedRoute extends _i41.PageRouteInfo { const GettingStartedRoute({List<_i41.PageRouteInfo>? children}) - : super(GettingStartedRoute.name, initialChildren: children); + : super(GettingStartedRoute.name, initialChildren: children); static const String name = 'GettingStartedRoute'; @@ -228,15 +228,15 @@ class HomeBrowseSectionItemsRoute required _i43.SpotubeBrowseSectionObject section, List<_i41.PageRouteInfo>? children, }) : super( - HomeBrowseSectionItemsRoute.name, - args: HomeBrowseSectionItemsRouteArgs( - key: key, - sectionId: sectionId, - section: section, - ), - rawPathParams: {'sectionId': sectionId}, - initialChildren: children, - ); + HomeBrowseSectionItemsRoute.name, + args: HomeBrowseSectionItemsRouteArgs( + key: key, + sectionId: sectionId, + section: section, + ), + rawPathParams: {'sectionId': sectionId}, + initialChildren: children, + ); static const String name = 'HomeBrowseSectionItemsRoute'; @@ -276,7 +276,7 @@ class HomeBrowseSectionItemsRouteArgs { /// [_i9.HomePage] class HomeRoute extends _i41.PageRouteInfo { const HomeRoute({List<_i41.PageRouteInfo>? children}) - : super(HomeRoute.name, initialChildren: children); + : super(HomeRoute.name, initialChildren: children); static const String name = 'HomeRoute'; @@ -292,7 +292,7 @@ class HomeRoute extends _i41.PageRouteInfo { /// [_i10.LastFMLoginPage] class LastFMLoginRoute extends _i41.PageRouteInfo { const LastFMLoginRoute({List<_i41.PageRouteInfo>? children}) - : super(LastFMLoginRoute.name, initialChildren: children); + : super(LastFMLoginRoute.name, initialChildren: children); static const String name = 'LastFMLoginRoute'; @@ -308,7 +308,7 @@ class LastFMLoginRoute extends _i41.PageRouteInfo { /// [_i11.LibraryPage] class LibraryRoute extends _i41.PageRouteInfo { const LibraryRoute({List<_i41.PageRouteInfo>? children}) - : super(LibraryRoute.name, initialChildren: children); + : super(LibraryRoute.name, initialChildren: children); static const String name = 'LibraryRoute'; @@ -328,10 +328,10 @@ class LikedPlaylistRoute extends _i41.PageRouteInfo { required _i43.SpotubeSimplePlaylistObject playlist, List<_i41.PageRouteInfo>? children, }) : super( - LikedPlaylistRoute.name, - args: LikedPlaylistRouteArgs(key: key, playlist: playlist), - initialChildren: children, - ); + LikedPlaylistRoute.name, + args: LikedPlaylistRouteArgs(key: key, playlist: playlist), + initialChildren: children, + ); static const String name = 'LikedPlaylistRoute'; @@ -367,15 +367,15 @@ class LocalLibraryRoute extends _i41.PageRouteInfo { bool isCache = false, List<_i41.PageRouteInfo>? children, }) : super( - LocalLibraryRoute.name, - args: LocalLibraryRouteArgs( - location: location, - key: key, - isDownloads: isDownloads, - isCache: isCache, - ), - initialChildren: children, - ); + LocalLibraryRoute.name, + args: LocalLibraryRouteArgs( + location: location, + key: key, + isDownloads: isDownloads, + isCache: isCache, + ), + initialChildren: children, + ); static const String name = 'LocalLibraryRoute'; @@ -419,7 +419,7 @@ class LocalLibraryRouteArgs { /// [_i14.LogsPage] class LogsRoute extends _i41.PageRouteInfo { const LogsRoute({List<_i41.PageRouteInfo>? children}) - : super(LogsRoute.name, initialChildren: children); + : super(LogsRoute.name, initialChildren: children); static const String name = 'LogsRoute'; @@ -435,7 +435,7 @@ class LogsRoute extends _i41.PageRouteInfo { /// [_i15.LyricsPage] class LyricsRoute extends _i41.PageRouteInfo { const LyricsRoute({List<_i41.PageRouteInfo>? children}) - : super(LyricsRoute.name, initialChildren: children); + : super(LyricsRoute.name, initialChildren: children); static const String name = 'LyricsRoute'; @@ -455,10 +455,10 @@ class MiniLyricsRoute extends _i41.PageRouteInfo { required _i44.Size prevSize, List<_i41.PageRouteInfo>? children, }) : super( - MiniLyricsRoute.name, - args: MiniLyricsRouteArgs(key: key, prevSize: prevSize), - initialChildren: children, - ); + MiniLyricsRoute.name, + args: MiniLyricsRouteArgs(key: key, prevSize: prevSize), + initialChildren: children, + ); static const String name = 'MiniLyricsRoute'; @@ -488,7 +488,7 @@ class MiniLyricsRouteArgs { /// [_i17.PlayerLyricsPage] class PlayerLyricsRoute extends _i41.PageRouteInfo { const PlayerLyricsRoute({List<_i41.PageRouteInfo>? children}) - : super(PlayerLyricsRoute.name, initialChildren: children); + : super(PlayerLyricsRoute.name, initialChildren: children); static const String name = 'PlayerLyricsRoute'; @@ -504,7 +504,7 @@ class PlayerLyricsRoute extends _i41.PageRouteInfo { /// [_i18.PlayerQueuePage] class PlayerQueueRoute extends _i41.PageRouteInfo { const PlayerQueueRoute({List<_i41.PageRouteInfo>? children}) - : super(PlayerQueueRoute.name, initialChildren: children); + : super(PlayerQueueRoute.name, initialChildren: children); static const String name = 'PlayerQueueRoute'; @@ -520,7 +520,7 @@ class PlayerQueueRoute extends _i41.PageRouteInfo { /// [_i19.PlayerTrackSourcesPage] class PlayerTrackSourcesRoute extends _i41.PageRouteInfo { const PlayerTrackSourcesRoute({List<_i41.PageRouteInfo>? children}) - : super(PlayerTrackSourcesRoute.name, initialChildren: children); + : super(PlayerTrackSourcesRoute.name, initialChildren: children); static const String name = 'PlayerTrackSourcesRoute'; @@ -541,11 +541,11 @@ class PlaylistRoute extends _i41.PageRouteInfo { required _i43.SpotubeSimplePlaylistObject playlist, List<_i41.PageRouteInfo>? children, }) : super( - PlaylistRoute.name, - args: PlaylistRouteArgs(key: key, id: id, playlist: playlist), - rawPathParams: {'id': id}, - initialChildren: children, - ); + PlaylistRoute.name, + args: PlaylistRouteArgs(key: key, id: id, playlist: playlist), + rawPathParams: {'id': id}, + initialChildren: children, + ); static const String name = 'PlaylistRoute'; @@ -581,7 +581,7 @@ class PlaylistRouteArgs { /// [_i21.ProfilePage] class ProfileRoute extends _i41.PageRouteInfo { const ProfileRoute({List<_i41.PageRouteInfo>? children}) - : super(ProfileRoute.name, initialChildren: children); + : super(ProfileRoute.name, initialChildren: children); static const String name = 'ProfileRoute'; @@ -597,7 +597,7 @@ class ProfileRoute extends _i41.PageRouteInfo { /// [_i22.RootAppPage] class RootAppRoute extends _i41.PageRouteInfo { const RootAppRoute({List<_i41.PageRouteInfo>? children}) - : super(RootAppRoute.name, initialChildren: children); + : super(RootAppRoute.name, initialChildren: children); static const String name = 'RootAppRoute'; @@ -613,7 +613,7 @@ class RootAppRoute extends _i41.PageRouteInfo { /// [_i23.SearchPage] class SearchRoute extends _i41.PageRouteInfo { const SearchRoute({List<_i41.PageRouteInfo>? children}) - : super(SearchRoute.name, initialChildren: children); + : super(SearchRoute.name, initialChildren: children); static const String name = 'SearchRoute'; @@ -635,14 +635,14 @@ class SettingsMetadataProviderFormRoute required List<_i43.MetadataFormFieldObject> fields, List<_i41.PageRouteInfo>? children, }) : super( - SettingsMetadataProviderFormRoute.name, - args: SettingsMetadataProviderFormRouteArgs( - key: key, - title: title, - fields: fields, - ), - initialChildren: children, - ); + SettingsMetadataProviderFormRoute.name, + args: SettingsMetadataProviderFormRouteArgs( + key: key, + title: title, + fields: fields, + ), + initialChildren: children, + ); static const String name = 'SettingsMetadataProviderFormRoute'; @@ -682,7 +682,7 @@ class SettingsMetadataProviderFormRouteArgs { /// [_i25.SettingsMetadataProviderPage] class SettingsMetadataProviderRoute extends _i41.PageRouteInfo { const SettingsMetadataProviderRoute({List<_i41.PageRouteInfo>? children}) - : super(SettingsMetadataProviderRoute.name, initialChildren: children); + : super(SettingsMetadataProviderRoute.name, initialChildren: children); static const String name = 'SettingsMetadataProviderRoute'; @@ -698,7 +698,7 @@ class SettingsMetadataProviderRoute extends _i41.PageRouteInfo { /// [_i26.SettingsPage] class SettingsRoute extends _i41.PageRouteInfo { const SettingsRoute({List<_i41.PageRouteInfo>? children}) - : super(SettingsRoute.name, initialChildren: children); + : super(SettingsRoute.name, initialChildren: children); static const String name = 'SettingsRoute'; @@ -714,7 +714,7 @@ class SettingsRoute extends _i41.PageRouteInfo { /// [_i27.SettingsScrobblingPage] class SettingsScrobblingRoute extends _i41.PageRouteInfo { const SettingsScrobblingRoute({List<_i41.PageRouteInfo>? children}) - : super(SettingsScrobblingRoute.name, initialChildren: children); + : super(SettingsScrobblingRoute.name, initialChildren: children); static const String name = 'SettingsScrobblingRoute'; @@ -730,7 +730,7 @@ class SettingsScrobblingRoute extends _i41.PageRouteInfo { /// [_i28.StatsAlbumsPage] class StatsAlbumsRoute extends _i41.PageRouteInfo { const StatsAlbumsRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsAlbumsRoute.name, initialChildren: children); + : super(StatsAlbumsRoute.name, initialChildren: children); static const String name = 'StatsAlbumsRoute'; @@ -746,7 +746,7 @@ class StatsAlbumsRoute extends _i41.PageRouteInfo { /// [_i29.StatsArtistsPage] class StatsArtistsRoute extends _i41.PageRouteInfo { const StatsArtistsRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsArtistsRoute.name, initialChildren: children); + : super(StatsArtistsRoute.name, initialChildren: children); static const String name = 'StatsArtistsRoute'; @@ -762,7 +762,7 @@ class StatsArtistsRoute extends _i41.PageRouteInfo { /// [_i30.StatsMinutesPage] class StatsMinutesRoute extends _i41.PageRouteInfo { const StatsMinutesRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsMinutesRoute.name, initialChildren: children); + : super(StatsMinutesRoute.name, initialChildren: children); static const String name = 'StatsMinutesRoute'; @@ -778,7 +778,7 @@ class StatsMinutesRoute extends _i41.PageRouteInfo { /// [_i31.StatsPage] class StatsRoute extends _i41.PageRouteInfo { const StatsRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsRoute.name, initialChildren: children); + : super(StatsRoute.name, initialChildren: children); static const String name = 'StatsRoute'; @@ -794,7 +794,7 @@ class StatsRoute extends _i41.PageRouteInfo { /// [_i32.StatsPlaylistsPage] class StatsPlaylistsRoute extends _i41.PageRouteInfo { const StatsPlaylistsRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsPlaylistsRoute.name, initialChildren: children); + : super(StatsPlaylistsRoute.name, initialChildren: children); static const String name = 'StatsPlaylistsRoute'; @@ -810,7 +810,7 @@ class StatsPlaylistsRoute extends _i41.PageRouteInfo { /// [_i33.StatsStreamFeesPage] class StatsStreamFeesRoute extends _i41.PageRouteInfo { const StatsStreamFeesRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsStreamFeesRoute.name, initialChildren: children); + : super(StatsStreamFeesRoute.name, initialChildren: children); static const String name = 'StatsStreamFeesRoute'; @@ -826,7 +826,7 @@ class StatsStreamFeesRoute extends _i41.PageRouteInfo { /// [_i34.StatsStreamsPage] class StatsStreamsRoute extends _i41.PageRouteInfo { const StatsStreamsRoute({List<_i41.PageRouteInfo>? children}) - : super(StatsStreamsRoute.name, initialChildren: children); + : super(StatsStreamsRoute.name, initialChildren: children); static const String name = 'StatsStreamsRoute'; @@ -846,11 +846,11 @@ class TrackRoute extends _i41.PageRouteInfo { required String trackId, List<_i41.PageRouteInfo>? children, }) : super( - TrackRoute.name, - args: TrackRouteArgs(key: key, trackId: trackId), - rawPathParams: {'id': trackId}, - initialChildren: children, - ); + TrackRoute.name, + args: TrackRouteArgs(key: key, trackId: trackId), + rawPathParams: {'id': trackId}, + initialChildren: children, + ); static const String name = 'TrackRoute'; @@ -883,7 +883,7 @@ class TrackRouteArgs { /// [_i36.UserAlbumsPage] class UserAlbumsRoute extends _i41.PageRouteInfo { const UserAlbumsRoute({List<_i41.PageRouteInfo>? children}) - : super(UserAlbumsRoute.name, initialChildren: children); + : super(UserAlbumsRoute.name, initialChildren: children); static const String name = 'UserAlbumsRoute'; @@ -899,7 +899,7 @@ class UserAlbumsRoute extends _i41.PageRouteInfo { /// [_i37.UserArtistsPage] class UserArtistsRoute extends _i41.PageRouteInfo { const UserArtistsRoute({List<_i41.PageRouteInfo>? children}) - : super(UserArtistsRoute.name, initialChildren: children); + : super(UserArtistsRoute.name, initialChildren: children); static const String name = 'UserArtistsRoute'; @@ -915,7 +915,7 @@ class UserArtistsRoute extends _i41.PageRouteInfo { /// [_i38.UserDownloadsPage] class UserDownloadsRoute extends _i41.PageRouteInfo { const UserDownloadsRoute({List<_i41.PageRouteInfo>? children}) - : super(UserDownloadsRoute.name, initialChildren: children); + : super(UserDownloadsRoute.name, initialChildren: children); static const String name = 'UserDownloadsRoute'; @@ -931,7 +931,7 @@ class UserDownloadsRoute extends _i41.PageRouteInfo { /// [_i39.UserLocalLibraryPage] class UserLocalLibraryRoute extends _i41.PageRouteInfo { const UserLocalLibraryRoute({List<_i41.PageRouteInfo>? children}) - : super(UserLocalLibraryRoute.name, initialChildren: children); + : super(UserLocalLibraryRoute.name, initialChildren: children); static const String name = 'UserLocalLibraryRoute'; @@ -947,7 +947,7 @@ class UserLocalLibraryRoute extends _i41.PageRouteInfo { /// [_i40.UserPlaylistsPage] class UserPlaylistsRoute extends _i41.PageRouteInfo { const UserPlaylistsRoute({List<_i41.PageRouteInfo>? children}) - : super(UserPlaylistsRoute.name, initialChildren: children); + : super(UserPlaylistsRoute.name, initialChildren: children); static const String name = 'UserPlaylistsRoute'; diff --git a/lib/main.dart b/lib/main.dart index ecf7148d..3f0260c8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,6 +45,9 @@ import 'package:spotube/services/kv_store/encrypted_kv_store.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/wm_tools/wm_tools.dart'; +import 'package:spotube/src/rust/api/plugin/models/core.dart'; +import 'package:spotube/src/rust/api/plugin/plugin.dart'; +import 'package:spotube/src/rust/frb_generated.dart'; import 'package:spotube/utils/migrations/sandbox.dart'; import 'package:spotube/utils/platform.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; @@ -55,6 +58,23 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:yt_dlp_dart/yt_dlp_dart.dart'; import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart'; +const pluginJS = """ +class CoreEndpoint { + async checkUpdate() { + console.log('Core checkUpdate'); + } + support() { + return 'Metadata'; + } +} + +class TestingPlugin { + constructor() { + this.core = new CoreEndpoint(); + } +} +"""; + Future main(List rawArgs) async { if (rawArgs.contains("web_view_title_bar")) { WidgetsFlutterBinding.ensureInitialized(); @@ -94,6 +114,26 @@ Future main(List rawArgs) async { await KVStoreService.initialize(); + await RustLib.init(); + + final plugin = SpotubePlugin(); + final sender = SpotubePlugin.newContext( + pluginScript: pluginJS, + pluginConfig: const PluginConfiguration( + entryPoint: "TestingPlugin", + abilities: [PluginAbility.metadata], + apis: [], + author: "KRTirtho", + description: "Testing Plugin", + name: "Testing Plugin", + pluginApiVersion: "2.0.0", + repository: null, + version: "0.1.0", + ), + ); + + await plugin.dispose(tx: sender); + if (kIsDesktop) { await windowManager.setPreventClose(true); await YtDlp.instance diff --git a/lib/src/rust/api/plugin/commands.dart b/lib/src/rust/api/plugin/commands.dart new file mode 100644 index 00000000..ae34c0fc --- /dev/null +++ b/lib/src/rust/api/plugin/commands.dart @@ -0,0 +1,12 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../frb_generated.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; + +// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `AlbumCommands`, `ArtistCommands`, `AudioSourceCommands`, `AuthCommands`, `BrowseCommands`, `CoreCommands`, `PlaylistCommands`, `SearchCommands`, `TrackCommands`, `UserCommands` + +// Rust type: RustOpaqueMoi> +abstract class PluginCommand implements RustOpaqueInterface {} diff --git a/lib/src/rust/api/plugin/models/album.dart b/lib/src/rust/api/plugin/models/album.dart new file mode 100644 index 00000000..e019b0ab --- /dev/null +++ b/lib/src/rust/api/plugin/models/album.dart @@ -0,0 +1,58 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'artist.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'album.freezed.dart'; +part 'album.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `clone`, `fmt`, `fmt`, `fmt` + +enum SpotubeAlbumType { + album, + single, + compilation, + ; +} + +@freezed +sealed class SpotubeFullAlbumObject with _$SpotubeFullAlbumObject { + const factory SpotubeFullAlbumObject({ + required String typeName, + required String id, + required String name, + required List artists, + required List images, + required String releaseDate, + required String externalUri, + required int totalTracks, + required SpotubeAlbumType albumType, + String? recordLabel, + List? genres, + }) = _SpotubeFullAlbumObject; + + factory SpotubeFullAlbumObject.fromJson(Map json) => + _$SpotubeFullAlbumObjectFromJson(json); +} + +@freezed +sealed class SpotubeSimpleAlbumObject with _$SpotubeSimpleAlbumObject { + const factory SpotubeSimpleAlbumObject({ + required String typeName, + required String id, + required String name, + required String externalUri, + required List artists, + required List images, + required SpotubeAlbumType albumType, + String? releaseDate, + }) = _SpotubeSimpleAlbumObject; + + factory SpotubeSimpleAlbumObject.fromJson(Map json) => + _$SpotubeSimpleAlbumObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/album.freezed.dart b/lib/src/rust/api/plugin/models/album.freezed.dart new file mode 100644 index 00000000..9ac14d78 --- /dev/null +++ b/lib/src/rust/api/plugin/models/album.freezed.dart @@ -0,0 +1,742 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'album.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeFullAlbumObject _$SpotubeFullAlbumObjectFromJson( + Map json) { + return _SpotubeFullAlbumObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeFullAlbumObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + List get artists => + throw _privateConstructorUsedError; + List get images => throw _privateConstructorUsedError; + String get releaseDate => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + int get totalTracks => throw _privateConstructorUsedError; + SpotubeAlbumType get albumType => throw _privateConstructorUsedError; + String? get recordLabel => throw _privateConstructorUsedError; + List? get genres => throw _privateConstructorUsedError; + + /// Serializes this SpotubeFullAlbumObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeFullAlbumObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeFullAlbumObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeFullAlbumObjectCopyWith<$Res> { + factory $SpotubeFullAlbumObjectCopyWith(SpotubeFullAlbumObject value, + $Res Function(SpotubeFullAlbumObject) then) = + _$SpotubeFullAlbumObjectCopyWithImpl<$Res, SpotubeFullAlbumObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + List artists, + List images, + String releaseDate, + String externalUri, + int totalTracks, + SpotubeAlbumType albumType, + String? recordLabel, + List? genres}); +} + +/// @nodoc +class _$SpotubeFullAlbumObjectCopyWithImpl<$Res, + $Val extends SpotubeFullAlbumObject> + implements $SpotubeFullAlbumObjectCopyWith<$Res> { + _$SpotubeFullAlbumObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeFullAlbumObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? artists = null, + Object? images = null, + Object? releaseDate = null, + Object? externalUri = null, + Object? totalTracks = null, + Object? albumType = null, + Object? recordLabel = freezed, + Object? genres = freezed, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + images: null == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List, + releaseDate: null == releaseDate + ? _value.releaseDate + : releaseDate // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + totalTracks: null == totalTracks + ? _value.totalTracks + : totalTracks // ignore: cast_nullable_to_non_nullable + as int, + albumType: null == albumType + ? _value.albumType + : albumType // ignore: cast_nullable_to_non_nullable + as SpotubeAlbumType, + recordLabel: freezed == recordLabel + ? _value.recordLabel + : recordLabel // ignore: cast_nullable_to_non_nullable + as String?, + genres: freezed == genres + ? _value.genres + : genres // ignore: cast_nullable_to_non_nullable + as List?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeFullAlbumObjectImplCopyWith<$Res> + implements $SpotubeFullAlbumObjectCopyWith<$Res> { + factory _$$SpotubeFullAlbumObjectImplCopyWith( + _$SpotubeFullAlbumObjectImpl value, + $Res Function(_$SpotubeFullAlbumObjectImpl) then) = + __$$SpotubeFullAlbumObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + List artists, + List images, + String releaseDate, + String externalUri, + int totalTracks, + SpotubeAlbumType albumType, + String? recordLabel, + List? genres}); +} + +/// @nodoc +class __$$SpotubeFullAlbumObjectImplCopyWithImpl<$Res> + extends _$SpotubeFullAlbumObjectCopyWithImpl<$Res, + _$SpotubeFullAlbumObjectImpl> + implements _$$SpotubeFullAlbumObjectImplCopyWith<$Res> { + __$$SpotubeFullAlbumObjectImplCopyWithImpl( + _$SpotubeFullAlbumObjectImpl _value, + $Res Function(_$SpotubeFullAlbumObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeFullAlbumObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? artists = null, + Object? images = null, + Object? releaseDate = null, + Object? externalUri = null, + Object? totalTracks = null, + Object? albumType = null, + Object? recordLabel = freezed, + Object? genres = freezed, + }) { + return _then(_$SpotubeFullAlbumObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + images: null == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List, + releaseDate: null == releaseDate + ? _value.releaseDate + : releaseDate // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + totalTracks: null == totalTracks + ? _value.totalTracks + : totalTracks // ignore: cast_nullable_to_non_nullable + as int, + albumType: null == albumType + ? _value.albumType + : albumType // ignore: cast_nullable_to_non_nullable + as SpotubeAlbumType, + recordLabel: freezed == recordLabel + ? _value.recordLabel + : recordLabel // ignore: cast_nullable_to_non_nullable + as String?, + genres: freezed == genres + ? _value._genres + : genres // ignore: cast_nullable_to_non_nullable + as List?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeFullAlbumObjectImpl implements _SpotubeFullAlbumObject { + const _$SpotubeFullAlbumObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required final List artists, + required final List images, + required this.releaseDate, + required this.externalUri, + required this.totalTracks, + required this.albumType, + this.recordLabel, + final List? genres}) + : _artists = artists, + _images = images, + _genres = genres; + + factory _$SpotubeFullAlbumObjectImpl.fromJson(Map json) => + _$$SpotubeFullAlbumObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + final List _images; + @override + List get images { + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_images); + } + + @override + final String releaseDate; + @override + final String externalUri; + @override + final int totalTracks; + @override + final SpotubeAlbumType albumType; + @override + final String? recordLabel; + final List? _genres; + @override + List? get genres { + final value = _genres; + if (value == null) return null; + if (_genres is EqualUnmodifiableListView) return _genres; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'SpotubeFullAlbumObject(typeName: $typeName, id: $id, name: $name, artists: $artists, images: $images, releaseDate: $releaseDate, externalUri: $externalUri, totalTracks: $totalTracks, albumType: $albumType, recordLabel: $recordLabel, genres: $genres)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeFullAlbumObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + const DeepCollectionEquality().equals(other._artists, _artists) && + const DeepCollectionEquality().equals(other._images, _images) && + (identical(other.releaseDate, releaseDate) || + other.releaseDate == releaseDate) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + (identical(other.totalTracks, totalTracks) || + other.totalTracks == totalTracks) && + (identical(other.albumType, albumType) || + other.albumType == albumType) && + (identical(other.recordLabel, recordLabel) || + other.recordLabel == recordLabel) && + const DeepCollectionEquality().equals(other._genres, _genres)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + id, + name, + const DeepCollectionEquality().hash(_artists), + const DeepCollectionEquality().hash(_images), + releaseDate, + externalUri, + totalTracks, + albumType, + recordLabel, + const DeepCollectionEquality().hash(_genres)); + + /// Create a copy of SpotubeFullAlbumObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeFullAlbumObjectImplCopyWith<_$SpotubeFullAlbumObjectImpl> + get copyWith => __$$SpotubeFullAlbumObjectImplCopyWithImpl< + _$SpotubeFullAlbumObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeFullAlbumObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeFullAlbumObject implements SpotubeFullAlbumObject { + const factory _SpotubeFullAlbumObject( + {required final String typeName, + required final String id, + required final String name, + required final List artists, + required final List images, + required final String releaseDate, + required final String externalUri, + required final int totalTracks, + required final SpotubeAlbumType albumType, + final String? recordLabel, + final List? genres}) = _$SpotubeFullAlbumObjectImpl; + + factory _SpotubeFullAlbumObject.fromJson(Map json) = + _$SpotubeFullAlbumObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + List get artists; + @override + List get images; + @override + String get releaseDate; + @override + String get externalUri; + @override + int get totalTracks; + @override + SpotubeAlbumType get albumType; + @override + String? get recordLabel; + @override + List? get genres; + + /// Create a copy of SpotubeFullAlbumObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeFullAlbumObjectImplCopyWith<_$SpotubeFullAlbumObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeSimpleAlbumObject _$SpotubeSimpleAlbumObjectFromJson( + Map json) { + return _SpotubeSimpleAlbumObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeSimpleAlbumObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + List get artists => + throw _privateConstructorUsedError; + List get images => throw _privateConstructorUsedError; + SpotubeAlbumType get albumType => throw _privateConstructorUsedError; + String? get releaseDate => throw _privateConstructorUsedError; + + /// Serializes this SpotubeSimpleAlbumObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeSimpleAlbumObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeSimpleAlbumObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeSimpleAlbumObjectCopyWith<$Res> { + factory $SpotubeSimpleAlbumObjectCopyWith(SpotubeSimpleAlbumObject value, + $Res Function(SpotubeSimpleAlbumObject) then) = + _$SpotubeSimpleAlbumObjectCopyWithImpl<$Res, SpotubeSimpleAlbumObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List artists, + List images, + SpotubeAlbumType albumType, + String? releaseDate}); +} + +/// @nodoc +class _$SpotubeSimpleAlbumObjectCopyWithImpl<$Res, + $Val extends SpotubeSimpleAlbumObject> + implements $SpotubeSimpleAlbumObjectCopyWith<$Res> { + _$SpotubeSimpleAlbumObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeSimpleAlbumObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? artists = null, + Object? images = null, + Object? albumType = null, + Object? releaseDate = freezed, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + images: null == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List, + albumType: null == albumType + ? _value.albumType + : albumType // ignore: cast_nullable_to_non_nullable + as SpotubeAlbumType, + releaseDate: freezed == releaseDate + ? _value.releaseDate + : releaseDate // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeSimpleAlbumObjectImplCopyWith<$Res> + implements $SpotubeSimpleAlbumObjectCopyWith<$Res> { + factory _$$SpotubeSimpleAlbumObjectImplCopyWith( + _$SpotubeSimpleAlbumObjectImpl value, + $Res Function(_$SpotubeSimpleAlbumObjectImpl) then) = + __$$SpotubeSimpleAlbumObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List artists, + List images, + SpotubeAlbumType albumType, + String? releaseDate}); +} + +/// @nodoc +class __$$SpotubeSimpleAlbumObjectImplCopyWithImpl<$Res> + extends _$SpotubeSimpleAlbumObjectCopyWithImpl<$Res, + _$SpotubeSimpleAlbumObjectImpl> + implements _$$SpotubeSimpleAlbumObjectImplCopyWith<$Res> { + __$$SpotubeSimpleAlbumObjectImplCopyWithImpl( + _$SpotubeSimpleAlbumObjectImpl _value, + $Res Function(_$SpotubeSimpleAlbumObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeSimpleAlbumObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? artists = null, + Object? images = null, + Object? albumType = null, + Object? releaseDate = freezed, + }) { + return _then(_$SpotubeSimpleAlbumObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + images: null == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List, + albumType: null == albumType + ? _value.albumType + : albumType // ignore: cast_nullable_to_non_nullable + as SpotubeAlbumType, + releaseDate: freezed == releaseDate + ? _value.releaseDate + : releaseDate // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeSimpleAlbumObjectImpl implements _SpotubeSimpleAlbumObject { + const _$SpotubeSimpleAlbumObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.externalUri, + required final List artists, + required final List images, + required this.albumType, + this.releaseDate}) + : _artists = artists, + _images = images; + + factory _$SpotubeSimpleAlbumObjectImpl.fromJson(Map json) => + _$$SpotubeSimpleAlbumObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String externalUri; + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + final List _images; + @override + List get images { + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_images); + } + + @override + final SpotubeAlbumType albumType; + @override + final String? releaseDate; + + @override + String toString() { + return 'SpotubeSimpleAlbumObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, artists: $artists, images: $images, albumType: $albumType, releaseDate: $releaseDate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeSimpleAlbumObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + const DeepCollectionEquality().equals(other._artists, _artists) && + const DeepCollectionEquality().equals(other._images, _images) && + (identical(other.albumType, albumType) || + other.albumType == albumType) && + (identical(other.releaseDate, releaseDate) || + other.releaseDate == releaseDate)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + id, + name, + externalUri, + const DeepCollectionEquality().hash(_artists), + const DeepCollectionEquality().hash(_images), + albumType, + releaseDate); + + /// Create a copy of SpotubeSimpleAlbumObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeSimpleAlbumObjectImplCopyWith<_$SpotubeSimpleAlbumObjectImpl> + get copyWith => __$$SpotubeSimpleAlbumObjectImplCopyWithImpl< + _$SpotubeSimpleAlbumObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeSimpleAlbumObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeSimpleAlbumObject implements SpotubeSimpleAlbumObject { + const factory _SpotubeSimpleAlbumObject( + {required final String typeName, + required final String id, + required final String name, + required final String externalUri, + required final List artists, + required final List images, + required final SpotubeAlbumType albumType, + final String? releaseDate}) = _$SpotubeSimpleAlbumObjectImpl; + + factory _SpotubeSimpleAlbumObject.fromJson(Map json) = + _$SpotubeSimpleAlbumObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get externalUri; + @override + List get artists; + @override + List get images; + @override + SpotubeAlbumType get albumType; + @override + String? get releaseDate; + + /// Create a copy of SpotubeSimpleAlbumObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeSimpleAlbumObjectImplCopyWith<_$SpotubeSimpleAlbumObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/album.g.dart b/lib/src/rust/api/plugin/models/album.g.dart new file mode 100644 index 00000000..b096bffd --- /dev/null +++ b/lib/src/rust/api/plugin/models/album.g.dart @@ -0,0 +1,83 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'album.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeFullAlbumObjectImpl _$$SpotubeFullAlbumObjectImplFromJson(Map json) => + _$SpotubeFullAlbumObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + artists: (json['artists'] as List) + .map((e) => SpotubeSimpleArtistObject.fromJson( + Map.from(e as Map))) + .toList(), + images: (json['images'] as List) + .map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + releaseDate: json['releaseDate'] as String, + externalUri: json['externalUri'] as String, + totalTracks: (json['totalTracks'] as num).toInt(), + albumType: $enumDecode(_$SpotubeAlbumTypeEnumMap, json['albumType']), + recordLabel: json['recordLabel'] as String?, + genres: + (json['genres'] as List?)?.map((e) => e as String).toList(), + ); + +Map _$$SpotubeFullAlbumObjectImplToJson( + _$SpotubeFullAlbumObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'artists': instance.artists.map((e) => e.toJson()).toList(), + 'images': instance.images.map((e) => e.toJson()).toList(), + 'releaseDate': instance.releaseDate, + 'externalUri': instance.externalUri, + 'totalTracks': instance.totalTracks, + 'albumType': _$SpotubeAlbumTypeEnumMap[instance.albumType]!, + 'recordLabel': instance.recordLabel, + 'genres': instance.genres, + }; + +const _$SpotubeAlbumTypeEnumMap = { + SpotubeAlbumType.album: 'album', + SpotubeAlbumType.single: 'single', + SpotubeAlbumType.compilation: 'compilation', +}; + +_$SpotubeSimpleAlbumObjectImpl _$$SpotubeSimpleAlbumObjectImplFromJson( + Map json) => + _$SpotubeSimpleAlbumObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + externalUri: json['externalUri'] as String, + artists: (json['artists'] as List) + .map((e) => SpotubeSimpleArtistObject.fromJson( + Map.from(e as Map))) + .toList(), + images: (json['images'] as List) + .map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + albumType: $enumDecode(_$SpotubeAlbumTypeEnumMap, json['albumType']), + releaseDate: json['releaseDate'] as String?, + ); + +Map _$$SpotubeSimpleAlbumObjectImplToJson( + _$SpotubeSimpleAlbumObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'externalUri': instance.externalUri, + 'artists': instance.artists.map((e) => e.toJson()).toList(), + 'images': instance.images.map((e) => e.toJson()).toList(), + 'albumType': _$SpotubeAlbumTypeEnumMap[instance.albumType]!, + 'releaseDate': instance.releaseDate, + }; diff --git a/lib/src/rust/api/plugin/models/artist.dart b/lib/src/rust/api/plugin/models/artist.dart new file mode 100644 index 00000000..414c011c --- /dev/null +++ b/lib/src/rust/api/plugin/models/artist.dart @@ -0,0 +1,43 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'artist.freezed.dart'; +part 'artist.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `fmt`, `fmt` + +@freezed +sealed class SpotubeFullArtistObject with _$SpotubeFullArtistObject { + const factory SpotubeFullArtistObject({ + required String typeName, + required String id, + required String name, + required String externalUri, + required List images, + List? genres, + int? followers, + }) = _SpotubeFullArtistObject; + + factory SpotubeFullArtistObject.fromJson(Map json) => + _$SpotubeFullArtistObjectFromJson(json); +} + +@freezed +sealed class SpotubeSimpleArtistObject with _$SpotubeSimpleArtistObject { + const factory SpotubeSimpleArtistObject({ + required String typeName, + required String id, + required String name, + required String externalUri, + List? images, + }) = _SpotubeSimpleArtistObject; + + factory SpotubeSimpleArtistObject.fromJson(Map json) => + _$SpotubeSimpleArtistObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/artist.freezed.dart b/lib/src/rust/api/plugin/models/artist.freezed.dart new file mode 100644 index 00000000..edc0b0de --- /dev/null +++ b/lib/src/rust/api/plugin/models/artist.freezed.dart @@ -0,0 +1,572 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'artist.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeFullArtistObject _$SpotubeFullArtistObjectFromJson( + Map json) { + return _SpotubeFullArtistObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeFullArtistObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + List get images => throw _privateConstructorUsedError; + List? get genres => throw _privateConstructorUsedError; + int? get followers => throw _privateConstructorUsedError; + + /// Serializes this SpotubeFullArtistObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeFullArtistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeFullArtistObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeFullArtistObjectCopyWith<$Res> { + factory $SpotubeFullArtistObjectCopyWith(SpotubeFullArtistObject value, + $Res Function(SpotubeFullArtistObject) then) = + _$SpotubeFullArtistObjectCopyWithImpl<$Res, SpotubeFullArtistObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List images, + List? genres, + int? followers}); +} + +/// @nodoc +class _$SpotubeFullArtistObjectCopyWithImpl<$Res, + $Val extends SpotubeFullArtistObject> + implements $SpotubeFullArtistObjectCopyWith<$Res> { + _$SpotubeFullArtistObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeFullArtistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? images = null, + Object? genres = freezed, + Object? followers = freezed, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + images: null == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List, + genres: freezed == genres + ? _value.genres + : genres // ignore: cast_nullable_to_non_nullable + as List?, + followers: freezed == followers + ? _value.followers + : followers // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeFullArtistObjectImplCopyWith<$Res> + implements $SpotubeFullArtistObjectCopyWith<$Res> { + factory _$$SpotubeFullArtistObjectImplCopyWith( + _$SpotubeFullArtistObjectImpl value, + $Res Function(_$SpotubeFullArtistObjectImpl) then) = + __$$SpotubeFullArtistObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List images, + List? genres, + int? followers}); +} + +/// @nodoc +class __$$SpotubeFullArtistObjectImplCopyWithImpl<$Res> + extends _$SpotubeFullArtistObjectCopyWithImpl<$Res, + _$SpotubeFullArtistObjectImpl> + implements _$$SpotubeFullArtistObjectImplCopyWith<$Res> { + __$$SpotubeFullArtistObjectImplCopyWithImpl( + _$SpotubeFullArtistObjectImpl _value, + $Res Function(_$SpotubeFullArtistObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeFullArtistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? images = null, + Object? genres = freezed, + Object? followers = freezed, + }) { + return _then(_$SpotubeFullArtistObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + images: null == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List, + genres: freezed == genres + ? _value._genres + : genres // ignore: cast_nullable_to_non_nullable + as List?, + followers: freezed == followers + ? _value.followers + : followers // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeFullArtistObjectImpl implements _SpotubeFullArtistObject { + const _$SpotubeFullArtistObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.externalUri, + required final List images, + final List? genres, + this.followers}) + : _images = images, + _genres = genres; + + factory _$SpotubeFullArtistObjectImpl.fromJson(Map json) => + _$$SpotubeFullArtistObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String externalUri; + final List _images; + @override + List get images { + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_images); + } + + final List? _genres; + @override + List? get genres { + final value = _genres; + if (value == null) return null; + if (_genres is EqualUnmodifiableListView) return _genres; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + final int? followers; + + @override + String toString() { + return 'SpotubeFullArtistObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, images: $images, genres: $genres, followers: $followers)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeFullArtistObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + const DeepCollectionEquality().equals(other._images, _images) && + const DeepCollectionEquality().equals(other._genres, _genres) && + (identical(other.followers, followers) || + other.followers == followers)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + id, + name, + externalUri, + const DeepCollectionEquality().hash(_images), + const DeepCollectionEquality().hash(_genres), + followers); + + /// Create a copy of SpotubeFullArtistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeFullArtistObjectImplCopyWith<_$SpotubeFullArtistObjectImpl> + get copyWith => __$$SpotubeFullArtistObjectImplCopyWithImpl< + _$SpotubeFullArtistObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeFullArtistObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeFullArtistObject implements SpotubeFullArtistObject { + const factory _SpotubeFullArtistObject( + {required final String typeName, + required final String id, + required final String name, + required final String externalUri, + required final List images, + final List? genres, + final int? followers}) = _$SpotubeFullArtistObjectImpl; + + factory _SpotubeFullArtistObject.fromJson(Map json) = + _$SpotubeFullArtistObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get externalUri; + @override + List get images; + @override + List? get genres; + @override + int? get followers; + + /// Create a copy of SpotubeFullArtistObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeFullArtistObjectImplCopyWith<_$SpotubeFullArtistObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeSimpleArtistObject _$SpotubeSimpleArtistObjectFromJson( + Map json) { + return _SpotubeSimpleArtistObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeSimpleArtistObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + List? get images => throw _privateConstructorUsedError; + + /// Serializes this SpotubeSimpleArtistObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeSimpleArtistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeSimpleArtistObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeSimpleArtistObjectCopyWith<$Res> { + factory $SpotubeSimpleArtistObjectCopyWith(SpotubeSimpleArtistObject value, + $Res Function(SpotubeSimpleArtistObject) then) = + _$SpotubeSimpleArtistObjectCopyWithImpl<$Res, SpotubeSimpleArtistObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List? images}); +} + +/// @nodoc +class _$SpotubeSimpleArtistObjectCopyWithImpl<$Res, + $Val extends SpotubeSimpleArtistObject> + implements $SpotubeSimpleArtistObjectCopyWith<$Res> { + _$SpotubeSimpleArtistObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeSimpleArtistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? images = freezed, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + images: freezed == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeSimpleArtistObjectImplCopyWith<$Res> + implements $SpotubeSimpleArtistObjectCopyWith<$Res> { + factory _$$SpotubeSimpleArtistObjectImplCopyWith( + _$SpotubeSimpleArtistObjectImpl value, + $Res Function(_$SpotubeSimpleArtistObjectImpl) then) = + __$$SpotubeSimpleArtistObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List? images}); +} + +/// @nodoc +class __$$SpotubeSimpleArtistObjectImplCopyWithImpl<$Res> + extends _$SpotubeSimpleArtistObjectCopyWithImpl<$Res, + _$SpotubeSimpleArtistObjectImpl> + implements _$$SpotubeSimpleArtistObjectImplCopyWith<$Res> { + __$$SpotubeSimpleArtistObjectImplCopyWithImpl( + _$SpotubeSimpleArtistObjectImpl _value, + $Res Function(_$SpotubeSimpleArtistObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeSimpleArtistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? images = freezed, + }) { + return _then(_$SpotubeSimpleArtistObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + images: freezed == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeSimpleArtistObjectImpl implements _SpotubeSimpleArtistObject { + const _$SpotubeSimpleArtistObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.externalUri, + final List? images}) + : _images = images; + + factory _$SpotubeSimpleArtistObjectImpl.fromJson(Map json) => + _$$SpotubeSimpleArtistObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String externalUri; + final List? _images; + @override + List? get images { + final value = _images; + if (value == null) return null; + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'SpotubeSimpleArtistObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, images: $images)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeSimpleArtistObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + const DeepCollectionEquality().equals(other._images, _images)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, typeName, id, name, externalUri, + const DeepCollectionEquality().hash(_images)); + + /// Create a copy of SpotubeSimpleArtistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeSimpleArtistObjectImplCopyWith<_$SpotubeSimpleArtistObjectImpl> + get copyWith => __$$SpotubeSimpleArtistObjectImplCopyWithImpl< + _$SpotubeSimpleArtistObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeSimpleArtistObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeSimpleArtistObject implements SpotubeSimpleArtistObject { + const factory _SpotubeSimpleArtistObject( + {required final String typeName, + required final String id, + required final String name, + required final String externalUri, + final List? images}) = + _$SpotubeSimpleArtistObjectImpl; + + factory _SpotubeSimpleArtistObject.fromJson(Map json) = + _$SpotubeSimpleArtistObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get externalUri; + @override + List? get images; + + /// Create a copy of SpotubeSimpleArtistObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeSimpleArtistObjectImplCopyWith<_$SpotubeSimpleArtistObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/artist.g.dart b/lib/src/rust/api/plugin/models/artist.g.dart new file mode 100644 index 00000000..fac177b6 --- /dev/null +++ b/lib/src/rust/api/plugin/models/artist.g.dart @@ -0,0 +1,58 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'artist.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeFullArtistObjectImpl _$$SpotubeFullArtistObjectImplFromJson( + Map json) => + _$SpotubeFullArtistObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + externalUri: json['externalUri'] as String, + images: (json['images'] as List) + .map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + genres: + (json['genres'] as List?)?.map((e) => e as String).toList(), + followers: (json['followers'] as num?)?.toInt(), + ); + +Map _$$SpotubeFullArtistObjectImplToJson( + _$SpotubeFullArtistObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'externalUri': instance.externalUri, + 'images': instance.images.map((e) => e.toJson()).toList(), + 'genres': instance.genres, + 'followers': instance.followers, + }; + +_$SpotubeSimpleArtistObjectImpl _$$SpotubeSimpleArtistObjectImplFromJson( + Map json) => + _$SpotubeSimpleArtistObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + externalUri: json['externalUri'] as String, + images: (json['images'] as List?) + ?.map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + ); + +Map _$$SpotubeSimpleArtistObjectImplToJson( + _$SpotubeSimpleArtistObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'externalUri': instance.externalUri, + 'images': instance.images?.map((e) => e.toJson()).toList(), + }; diff --git a/lib/src/rust/api/plugin/models/audio_source.dart b/lib/src/rust/api/plugin/models/audio_source.dart new file mode 100644 index 00000000..c8652e40 --- /dev/null +++ b/lib/src/rust/api/plugin/models/audio_source.dart @@ -0,0 +1,114 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'audio_source.freezed.dart'; +part 'audio_source.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt` + +@freezed +sealed class SpotubeAudioLosslessContainerQuality + with _$SpotubeAudioLosslessContainerQuality { + const SpotubeAudioLosslessContainerQuality._(); + const factory SpotubeAudioLosslessContainerQuality({ + required int bitDepth, + required int sampleRate, + }) = _SpotubeAudioLosslessContainerQuality; + String toStringFmt() => RustLib.instance.api + .crateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmt( + that: this, + ); + + factory SpotubeAudioLosslessContainerQuality.fromJson( + Map json) => + _$SpotubeAudioLosslessContainerQualityFromJson(json); +} + +@freezed +sealed class SpotubeAudioLossyContainerQuality + with _$SpotubeAudioLossyContainerQuality { + const SpotubeAudioLossyContainerQuality._(); + const factory SpotubeAudioLossyContainerQuality({ + required int bitrate, + }) = _SpotubeAudioLossyContainerQuality; + Future toStringFmt() => RustLib.instance.api + .crateApiPluginModelsAudioSourceSpotubeAudioLossyContainerQualityToStringFmt( + that: this, + ); + + factory SpotubeAudioLossyContainerQuality.fromJson( + Map json) => + _$SpotubeAudioLossyContainerQualityFromJson(json); +} + +@freezed +sealed class SpotubeAudioSourceContainerPreset + with _$SpotubeAudioSourceContainerPreset { + const SpotubeAudioSourceContainerPreset._(); + + const factory SpotubeAudioSourceContainerPreset.lossy({ + required SpotubeMediaCompressionType compressionType, + required String name, + required List qualities, + }) = SpotubeAudioSourceContainerPreset_Lossy; + const factory SpotubeAudioSourceContainerPreset.lossless({ + required SpotubeMediaCompressionType compressionType, + required String name, + required List qualities, + }) = SpotubeAudioSourceContainerPreset_Lossless; + + factory SpotubeAudioSourceContainerPreset.fromJson( + Map json) => + _$SpotubeAudioSourceContainerPresetFromJson(json); + + String fileExtension() => RustLib.instance.api + .crateApiPluginModelsAudioSourceSpotubeAudioSourceContainerPresetFileExtension( + that: this, + ); +} + +@freezed +sealed class SpotubeAudioSourceMatchObject + with _$SpotubeAudioSourceMatchObject { + const factory SpotubeAudioSourceMatchObject({ + required String typeName, + required String id, + required String title, + required List artists, + required BigInt duration, + String? thumbnail, + required String externalUri, + }) = _SpotubeAudioSourceMatchObject; + + factory SpotubeAudioSourceMatchObject.fromJson(Map json) => + _$SpotubeAudioSourceMatchObjectFromJson(json); +} + +@freezed +sealed class SpotubeAudioSourceStreamObject + with _$SpotubeAudioSourceStreamObject { + const factory SpotubeAudioSourceStreamObject({ + required String typeName, + required String url, + required String container, + required SpotubeMediaCompressionType compressionType, + String? codec, + double? bitrate, + int? bitDepth, + double? sampleRate, + }) = _SpotubeAudioSourceStreamObject; + + factory SpotubeAudioSourceStreamObject.fromJson(Map json) => + _$SpotubeAudioSourceStreamObjectFromJson(json); +} + +enum SpotubeMediaCompressionType { + lossy, + lossless, + ; +} diff --git a/lib/src/rust/api/plugin/models/audio_source.freezed.dart b/lib/src/rust/api/plugin/models/audio_source.freezed.dart new file mode 100644 index 00000000..b0904f73 --- /dev/null +++ b/lib/src/rust/api/plugin/models/audio_source.freezed.dart @@ -0,0 +1,1581 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'audio_source.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeAudioLosslessContainerQuality + _$SpotubeAudioLosslessContainerQualityFromJson(Map json) { + return _SpotubeAudioLosslessContainerQuality.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeAudioLosslessContainerQuality { + int get bitDepth => throw _privateConstructorUsedError; + int get sampleRate => throw _privateConstructorUsedError; + + /// Serializes this SpotubeAudioLosslessContainerQuality to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeAudioLosslessContainerQuality + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeAudioLosslessContainerQualityCopyWith< + SpotubeAudioLosslessContainerQuality> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeAudioLosslessContainerQualityCopyWith<$Res> { + factory $SpotubeAudioLosslessContainerQualityCopyWith( + SpotubeAudioLosslessContainerQuality value, + $Res Function(SpotubeAudioLosslessContainerQuality) then) = + _$SpotubeAudioLosslessContainerQualityCopyWithImpl<$Res, + SpotubeAudioLosslessContainerQuality>; + @useResult + $Res call({int bitDepth, int sampleRate}); +} + +/// @nodoc +class _$SpotubeAudioLosslessContainerQualityCopyWithImpl<$Res, + $Val extends SpotubeAudioLosslessContainerQuality> + implements $SpotubeAudioLosslessContainerQualityCopyWith<$Res> { + _$SpotubeAudioLosslessContainerQualityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeAudioLosslessContainerQuality + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? bitDepth = null, + Object? sampleRate = null, + }) { + return _then(_value.copyWith( + bitDepth: null == bitDepth + ? _value.bitDepth + : bitDepth // ignore: cast_nullable_to_non_nullable + as int, + sampleRate: null == sampleRate + ? _value.sampleRate + : sampleRate // ignore: cast_nullable_to_non_nullable + as int, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeAudioLosslessContainerQualityImplCopyWith<$Res> + implements $SpotubeAudioLosslessContainerQualityCopyWith<$Res> { + factory _$$SpotubeAudioLosslessContainerQualityImplCopyWith( + _$SpotubeAudioLosslessContainerQualityImpl value, + $Res Function(_$SpotubeAudioLosslessContainerQualityImpl) then) = + __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int bitDepth, int sampleRate}); +} + +/// @nodoc +class __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl<$Res> + extends _$SpotubeAudioLosslessContainerQualityCopyWithImpl<$Res, + _$SpotubeAudioLosslessContainerQualityImpl> + implements _$$SpotubeAudioLosslessContainerQualityImplCopyWith<$Res> { + __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl( + _$SpotubeAudioLosslessContainerQualityImpl _value, + $Res Function(_$SpotubeAudioLosslessContainerQualityImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeAudioLosslessContainerQuality + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? bitDepth = null, + Object? sampleRate = null, + }) { + return _then(_$SpotubeAudioLosslessContainerQualityImpl( + bitDepth: null == bitDepth + ? _value.bitDepth + : bitDepth // ignore: cast_nullable_to_non_nullable + as int, + sampleRate: null == sampleRate + ? _value.sampleRate + : sampleRate // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeAudioLosslessContainerQualityImpl + extends _SpotubeAudioLosslessContainerQuality { + const _$SpotubeAudioLosslessContainerQualityImpl( + {required this.bitDepth, required this.sampleRate}) + : super._(); + + factory _$SpotubeAudioLosslessContainerQualityImpl.fromJson( + Map json) => + _$$SpotubeAudioLosslessContainerQualityImplFromJson(json); + + @override + final int bitDepth; + @override + final int sampleRate; + + @override + String toString() { + return 'SpotubeAudioLosslessContainerQuality(bitDepth: $bitDepth, sampleRate: $sampleRate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeAudioLosslessContainerQualityImpl && + (identical(other.bitDepth, bitDepth) || + other.bitDepth == bitDepth) && + (identical(other.sampleRate, sampleRate) || + other.sampleRate == sampleRate)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, bitDepth, sampleRate); + + /// Create a copy of SpotubeAudioLosslessContainerQuality + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeAudioLosslessContainerQualityImplCopyWith< + _$SpotubeAudioLosslessContainerQualityImpl> + get copyWith => __$$SpotubeAudioLosslessContainerQualityImplCopyWithImpl< + _$SpotubeAudioLosslessContainerQualityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeAudioLosslessContainerQualityImplToJson( + this, + ); + } +} + +abstract class _SpotubeAudioLosslessContainerQuality + extends SpotubeAudioLosslessContainerQuality { + const factory _SpotubeAudioLosslessContainerQuality( + {required final int bitDepth, required final int sampleRate}) = + _$SpotubeAudioLosslessContainerQualityImpl; + const _SpotubeAudioLosslessContainerQuality._() : super._(); + + factory _SpotubeAudioLosslessContainerQuality.fromJson( + Map json) = + _$SpotubeAudioLosslessContainerQualityImpl.fromJson; + + @override + int get bitDepth; + @override + int get sampleRate; + + /// Create a copy of SpotubeAudioLosslessContainerQuality + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeAudioLosslessContainerQualityImplCopyWith< + _$SpotubeAudioLosslessContainerQualityImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeAudioLossyContainerQuality _$SpotubeAudioLossyContainerQualityFromJson( + Map json) { + return _SpotubeAudioLossyContainerQuality.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeAudioLossyContainerQuality { + int get bitrate => throw _privateConstructorUsedError; + + /// Serializes this SpotubeAudioLossyContainerQuality to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeAudioLossyContainerQuality + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeAudioLossyContainerQualityCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeAudioLossyContainerQualityCopyWith<$Res> { + factory $SpotubeAudioLossyContainerQualityCopyWith( + SpotubeAudioLossyContainerQuality value, + $Res Function(SpotubeAudioLossyContainerQuality) then) = + _$SpotubeAudioLossyContainerQualityCopyWithImpl<$Res, + SpotubeAudioLossyContainerQuality>; + @useResult + $Res call({int bitrate}); +} + +/// @nodoc +class _$SpotubeAudioLossyContainerQualityCopyWithImpl<$Res, + $Val extends SpotubeAudioLossyContainerQuality> + implements $SpotubeAudioLossyContainerQualityCopyWith<$Res> { + _$SpotubeAudioLossyContainerQualityCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeAudioLossyContainerQuality + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? bitrate = null, + }) { + return _then(_value.copyWith( + bitrate: null == bitrate + ? _value.bitrate + : bitrate // ignore: cast_nullable_to_non_nullable + as int, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeAudioLossyContainerQualityImplCopyWith<$Res> + implements $SpotubeAudioLossyContainerQualityCopyWith<$Res> { + factory _$$SpotubeAudioLossyContainerQualityImplCopyWith( + _$SpotubeAudioLossyContainerQualityImpl value, + $Res Function(_$SpotubeAudioLossyContainerQualityImpl) then) = + __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int bitrate}); +} + +/// @nodoc +class __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl<$Res> + extends _$SpotubeAudioLossyContainerQualityCopyWithImpl<$Res, + _$SpotubeAudioLossyContainerQualityImpl> + implements _$$SpotubeAudioLossyContainerQualityImplCopyWith<$Res> { + __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl( + _$SpotubeAudioLossyContainerQualityImpl _value, + $Res Function(_$SpotubeAudioLossyContainerQualityImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeAudioLossyContainerQuality + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? bitrate = null, + }) { + return _then(_$SpotubeAudioLossyContainerQualityImpl( + bitrate: null == bitrate + ? _value.bitrate + : bitrate // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeAudioLossyContainerQualityImpl + extends _SpotubeAudioLossyContainerQuality { + const _$SpotubeAudioLossyContainerQualityImpl({required this.bitrate}) + : super._(); + + factory _$SpotubeAudioLossyContainerQualityImpl.fromJson( + Map json) => + _$$SpotubeAudioLossyContainerQualityImplFromJson(json); + + @override + final int bitrate; + + @override + String toString() { + return 'SpotubeAudioLossyContainerQuality(bitrate: $bitrate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeAudioLossyContainerQualityImpl && + (identical(other.bitrate, bitrate) || other.bitrate == bitrate)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, bitrate); + + /// Create a copy of SpotubeAudioLossyContainerQuality + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeAudioLossyContainerQualityImplCopyWith< + _$SpotubeAudioLossyContainerQualityImpl> + get copyWith => __$$SpotubeAudioLossyContainerQualityImplCopyWithImpl< + _$SpotubeAudioLossyContainerQualityImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeAudioLossyContainerQualityImplToJson( + this, + ); + } +} + +abstract class _SpotubeAudioLossyContainerQuality + extends SpotubeAudioLossyContainerQuality { + const factory _SpotubeAudioLossyContainerQuality( + {required final int bitrate}) = _$SpotubeAudioLossyContainerQualityImpl; + const _SpotubeAudioLossyContainerQuality._() : super._(); + + factory _SpotubeAudioLossyContainerQuality.fromJson( + Map json) = + _$SpotubeAudioLossyContainerQualityImpl.fromJson; + + @override + int get bitrate; + + /// Create a copy of SpotubeAudioLossyContainerQuality + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeAudioLossyContainerQualityImplCopyWith< + _$SpotubeAudioLossyContainerQualityImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeAudioSourceContainerPreset _$SpotubeAudioSourceContainerPresetFromJson( + Map json) { + switch (json['runtimeType']) { + case 'lossy': + return SpotubeAudioSourceContainerPreset_Lossy.fromJson(json); + case 'lossless': + return SpotubeAudioSourceContainerPreset_Lossless.fromJson(json); + + default: + throw CheckedFromJsonException( + json, + 'runtimeType', + 'SpotubeAudioSourceContainerPreset', + 'Invalid union type "${json['runtimeType']}"!'); + } +} + +/// @nodoc +mixin _$SpotubeAudioSourceContainerPreset { + SpotubeMediaCompressionType get compressionType => + throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + List get qualities => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeMediaCompressionType compressionType, + String name, List qualities) + lossy, + required TResult Function(SpotubeMediaCompressionType compressionType, + String name, List qualities) + lossless, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossy, + TResult? Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossless, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossy, + TResult Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossless, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubeAudioSourceContainerPreset_Lossy value) + lossy, + required TResult Function(SpotubeAudioSourceContainerPreset_Lossless value) + lossless, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeAudioSourceContainerPreset_Lossy value)? lossy, + TResult? Function(SpotubeAudioSourceContainerPreset_Lossless value)? + lossless, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeAudioSourceContainerPreset_Lossy value)? lossy, + TResult Function(SpotubeAudioSourceContainerPreset_Lossless value)? + lossless, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + + /// Serializes this SpotubeAudioSourceContainerPreset to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeAudioSourceContainerPresetCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeAudioSourceContainerPresetCopyWith<$Res> { + factory $SpotubeAudioSourceContainerPresetCopyWith( + SpotubeAudioSourceContainerPreset value, + $Res Function(SpotubeAudioSourceContainerPreset) then) = + _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, + SpotubeAudioSourceContainerPreset>; + @useResult + $Res call({SpotubeMediaCompressionType compressionType, String name}); +} + +/// @nodoc +class _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, + $Val extends SpotubeAudioSourceContainerPreset> + implements $SpotubeAudioSourceContainerPresetCopyWith<$Res> { + _$SpotubeAudioSourceContainerPresetCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? compressionType = null, + Object? name = null, + }) { + return _then(_value.copyWith( + compressionType: null == compressionType + ? _value.compressionType + : compressionType // ignore: cast_nullable_to_non_nullable + as SpotubeMediaCompressionType, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeAudioSourceContainerPreset_LossyImplCopyWith<$Res> + implements $SpotubeAudioSourceContainerPresetCopyWith<$Res> { + factory _$$SpotubeAudioSourceContainerPreset_LossyImplCopyWith( + _$SpotubeAudioSourceContainerPreset_LossyImpl value, + $Res Function(_$SpotubeAudioSourceContainerPreset_LossyImpl) then) = + __$$SpotubeAudioSourceContainerPreset_LossyImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {SpotubeMediaCompressionType compressionType, + String name, + List qualities}); +} + +/// @nodoc +class __$$SpotubeAudioSourceContainerPreset_LossyImplCopyWithImpl<$Res> + extends _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, + _$SpotubeAudioSourceContainerPreset_LossyImpl> + implements _$$SpotubeAudioSourceContainerPreset_LossyImplCopyWith<$Res> { + __$$SpotubeAudioSourceContainerPreset_LossyImplCopyWithImpl( + _$SpotubeAudioSourceContainerPreset_LossyImpl _value, + $Res Function(_$SpotubeAudioSourceContainerPreset_LossyImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? compressionType = null, + Object? name = null, + Object? qualities = null, + }) { + return _then(_$SpotubeAudioSourceContainerPreset_LossyImpl( + compressionType: null == compressionType + ? _value.compressionType + : compressionType // ignore: cast_nullable_to_non_nullable + as SpotubeMediaCompressionType, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + qualities: null == qualities + ? _value._qualities + : qualities // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeAudioSourceContainerPreset_LossyImpl + extends SpotubeAudioSourceContainerPreset_Lossy { + const _$SpotubeAudioSourceContainerPreset_LossyImpl( + {required this.compressionType, + required this.name, + required final List qualities, + final String? $type}) + : _qualities = qualities, + $type = $type ?? 'lossy', + super._(); + + factory _$SpotubeAudioSourceContainerPreset_LossyImpl.fromJson( + Map json) => + _$$SpotubeAudioSourceContainerPreset_LossyImplFromJson(json); + + @override + final SpotubeMediaCompressionType compressionType; + @override + final String name; + final List _qualities; + @override + List get qualities { + if (_qualities is EqualUnmodifiableListView) return _qualities; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_qualities); + } + + @JsonKey(name: 'runtimeType') + final String $type; + + @override + String toString() { + return 'SpotubeAudioSourceContainerPreset.lossy(compressionType: $compressionType, name: $name, qualities: $qualities)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeAudioSourceContainerPreset_LossyImpl && + (identical(other.compressionType, compressionType) || + other.compressionType == compressionType) && + (identical(other.name, name) || other.name == name) && + const DeepCollectionEquality() + .equals(other._qualities, _qualities)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, compressionType, name, + const DeepCollectionEquality().hash(_qualities)); + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeAudioSourceContainerPreset_LossyImplCopyWith< + _$SpotubeAudioSourceContainerPreset_LossyImpl> + get copyWith => + __$$SpotubeAudioSourceContainerPreset_LossyImplCopyWithImpl< + _$SpotubeAudioSourceContainerPreset_LossyImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeMediaCompressionType compressionType, + String name, List qualities) + lossy, + required TResult Function(SpotubeMediaCompressionType compressionType, + String name, List qualities) + lossless, + }) { + return lossy(compressionType, name, qualities); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossy, + TResult? Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossless, + }) { + return lossy?.call(compressionType, name, qualities); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossy, + TResult Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossless, + required TResult orElse(), + }) { + if (lossy != null) { + return lossy(compressionType, name, qualities); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubeAudioSourceContainerPreset_Lossy value) + lossy, + required TResult Function(SpotubeAudioSourceContainerPreset_Lossless value) + lossless, + }) { + return lossy(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeAudioSourceContainerPreset_Lossy value)? lossy, + TResult? Function(SpotubeAudioSourceContainerPreset_Lossless value)? + lossless, + }) { + return lossy?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeAudioSourceContainerPreset_Lossy value)? lossy, + TResult Function(SpotubeAudioSourceContainerPreset_Lossless value)? + lossless, + required TResult orElse(), + }) { + if (lossy != null) { + return lossy(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$SpotubeAudioSourceContainerPreset_LossyImplToJson( + this, + ); + } +} + +abstract class SpotubeAudioSourceContainerPreset_Lossy + extends SpotubeAudioSourceContainerPreset { + const factory SpotubeAudioSourceContainerPreset_Lossy( + {required final SpotubeMediaCompressionType compressionType, + required final String name, + required final List qualities}) = + _$SpotubeAudioSourceContainerPreset_LossyImpl; + const SpotubeAudioSourceContainerPreset_Lossy._() : super._(); + + factory SpotubeAudioSourceContainerPreset_Lossy.fromJson( + Map json) = + _$SpotubeAudioSourceContainerPreset_LossyImpl.fromJson; + + @override + SpotubeMediaCompressionType get compressionType; + @override + String get name; + @override + List get qualities; + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeAudioSourceContainerPreset_LossyImplCopyWith< + _$SpotubeAudioSourceContainerPreset_LossyImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWith<$Res> + implements $SpotubeAudioSourceContainerPresetCopyWith<$Res> { + factory _$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWith( + _$SpotubeAudioSourceContainerPreset_LosslessImpl value, + $Res Function(_$SpotubeAudioSourceContainerPreset_LosslessImpl) + then) = + __$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {SpotubeMediaCompressionType compressionType, + String name, + List qualities}); +} + +/// @nodoc +class __$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWithImpl<$Res> + extends _$SpotubeAudioSourceContainerPresetCopyWithImpl<$Res, + _$SpotubeAudioSourceContainerPreset_LosslessImpl> + implements _$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWith<$Res> { + __$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWithImpl( + _$SpotubeAudioSourceContainerPreset_LosslessImpl _value, + $Res Function(_$SpotubeAudioSourceContainerPreset_LosslessImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? compressionType = null, + Object? name = null, + Object? qualities = null, + }) { + return _then(_$SpotubeAudioSourceContainerPreset_LosslessImpl( + compressionType: null == compressionType + ? _value.compressionType + : compressionType // ignore: cast_nullable_to_non_nullable + as SpotubeMediaCompressionType, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + qualities: null == qualities + ? _value._qualities + : qualities // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeAudioSourceContainerPreset_LosslessImpl + extends SpotubeAudioSourceContainerPreset_Lossless { + const _$SpotubeAudioSourceContainerPreset_LosslessImpl( + {required this.compressionType, + required this.name, + required final List qualities, + final String? $type}) + : _qualities = qualities, + $type = $type ?? 'lossless', + super._(); + + factory _$SpotubeAudioSourceContainerPreset_LosslessImpl.fromJson( + Map json) => + _$$SpotubeAudioSourceContainerPreset_LosslessImplFromJson(json); + + @override + final SpotubeMediaCompressionType compressionType; + @override + final String name; + final List _qualities; + @override + List get qualities { + if (_qualities is EqualUnmodifiableListView) return _qualities; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_qualities); + } + + @JsonKey(name: 'runtimeType') + final String $type; + + @override + String toString() { + return 'SpotubeAudioSourceContainerPreset.lossless(compressionType: $compressionType, name: $name, qualities: $qualities)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeAudioSourceContainerPreset_LosslessImpl && + (identical(other.compressionType, compressionType) || + other.compressionType == compressionType) && + (identical(other.name, name) || other.name == name) && + const DeepCollectionEquality() + .equals(other._qualities, _qualities)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, compressionType, name, + const DeepCollectionEquality().hash(_qualities)); + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWith< + _$SpotubeAudioSourceContainerPreset_LosslessImpl> + get copyWith => + __$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWithImpl< + _$SpotubeAudioSourceContainerPreset_LosslessImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeMediaCompressionType compressionType, + String name, List qualities) + lossy, + required TResult Function(SpotubeMediaCompressionType compressionType, + String name, List qualities) + lossless, + }) { + return lossless(compressionType, name, qualities); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossy, + TResult? Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossless, + }) { + return lossless?.call(compressionType, name, qualities); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossy, + TResult Function(SpotubeMediaCompressionType compressionType, String name, + List qualities)? + lossless, + required TResult orElse(), + }) { + if (lossless != null) { + return lossless(compressionType, name, qualities); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubeAudioSourceContainerPreset_Lossy value) + lossy, + required TResult Function(SpotubeAudioSourceContainerPreset_Lossless value) + lossless, + }) { + return lossless(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeAudioSourceContainerPreset_Lossy value)? lossy, + TResult? Function(SpotubeAudioSourceContainerPreset_Lossless value)? + lossless, + }) { + return lossless?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeAudioSourceContainerPreset_Lossy value)? lossy, + TResult Function(SpotubeAudioSourceContainerPreset_Lossless value)? + lossless, + required TResult orElse(), + }) { + if (lossless != null) { + return lossless(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$SpotubeAudioSourceContainerPreset_LosslessImplToJson( + this, + ); + } +} + +abstract class SpotubeAudioSourceContainerPreset_Lossless + extends SpotubeAudioSourceContainerPreset { + const factory SpotubeAudioSourceContainerPreset_Lossless( + {required final SpotubeMediaCompressionType compressionType, + required final String name, + required final List + qualities}) = _$SpotubeAudioSourceContainerPreset_LosslessImpl; + const SpotubeAudioSourceContainerPreset_Lossless._() : super._(); + + factory SpotubeAudioSourceContainerPreset_Lossless.fromJson( + Map json) = + _$SpotubeAudioSourceContainerPreset_LosslessImpl.fromJson; + + @override + SpotubeMediaCompressionType get compressionType; + @override + String get name; + @override + List get qualities; + + /// Create a copy of SpotubeAudioSourceContainerPreset + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeAudioSourceContainerPreset_LosslessImplCopyWith< + _$SpotubeAudioSourceContainerPreset_LosslessImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeAudioSourceMatchObject _$SpotubeAudioSourceMatchObjectFromJson( + Map json) { + return _SpotubeAudioSourceMatchObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeAudioSourceMatchObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get title => throw _privateConstructorUsedError; + List get artists => throw _privateConstructorUsedError; + BigInt get duration => throw _privateConstructorUsedError; + String? get thumbnail => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + + /// Serializes this SpotubeAudioSourceMatchObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeAudioSourceMatchObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeAudioSourceMatchObjectCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeAudioSourceMatchObjectCopyWith<$Res> { + factory $SpotubeAudioSourceMatchObjectCopyWith( + SpotubeAudioSourceMatchObject value, + $Res Function(SpotubeAudioSourceMatchObject) then) = + _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, + SpotubeAudioSourceMatchObject>; + @useResult + $Res call( + {String typeName, + String id, + String title, + List artists, + BigInt duration, + String? thumbnail, + String externalUri}); +} + +/// @nodoc +class _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, + $Val extends SpotubeAudioSourceMatchObject> + implements $SpotubeAudioSourceMatchObjectCopyWith<$Res> { + _$SpotubeAudioSourceMatchObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeAudioSourceMatchObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? title = null, + Object? artists = null, + Object? duration = null, + Object? thumbnail = freezed, + Object? externalUri = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + duration: null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as BigInt, + thumbnail: freezed == thumbnail + ? _value.thumbnail + : thumbnail // ignore: cast_nullable_to_non_nullable + as String?, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeAudioSourceMatchObjectImplCopyWith<$Res> + implements $SpotubeAudioSourceMatchObjectCopyWith<$Res> { + factory _$$SpotubeAudioSourceMatchObjectImplCopyWith( + _$SpotubeAudioSourceMatchObjectImpl value, + $Res Function(_$SpotubeAudioSourceMatchObjectImpl) then) = + __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String title, + List artists, + BigInt duration, + String? thumbnail, + String externalUri}); +} + +/// @nodoc +class __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl<$Res> + extends _$SpotubeAudioSourceMatchObjectCopyWithImpl<$Res, + _$SpotubeAudioSourceMatchObjectImpl> + implements _$$SpotubeAudioSourceMatchObjectImplCopyWith<$Res> { + __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl( + _$SpotubeAudioSourceMatchObjectImpl _value, + $Res Function(_$SpotubeAudioSourceMatchObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeAudioSourceMatchObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? title = null, + Object? artists = null, + Object? duration = null, + Object? thumbnail = freezed, + Object? externalUri = null, + }) { + return _then(_$SpotubeAudioSourceMatchObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + duration: null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as BigInt, + thumbnail: freezed == thumbnail + ? _value.thumbnail + : thumbnail // ignore: cast_nullable_to_non_nullable + as String?, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeAudioSourceMatchObjectImpl + implements _SpotubeAudioSourceMatchObject { + const _$SpotubeAudioSourceMatchObjectImpl( + {required this.typeName, + required this.id, + required this.title, + required final List artists, + required this.duration, + this.thumbnail, + required this.externalUri}) + : _artists = artists; + + factory _$SpotubeAudioSourceMatchObjectImpl.fromJson( + Map json) => + _$$SpotubeAudioSourceMatchObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String title; + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + @override + final BigInt duration; + @override + final String? thumbnail; + @override + final String externalUri; + + @override + String toString() { + return 'SpotubeAudioSourceMatchObject(typeName: $typeName, id: $id, title: $title, artists: $artists, duration: $duration, thumbnail: $thumbnail, externalUri: $externalUri)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeAudioSourceMatchObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.title, title) || other.title == title) && + const DeepCollectionEquality().equals(other._artists, _artists) && + (identical(other.duration, duration) || + other.duration == duration) && + (identical(other.thumbnail, thumbnail) || + other.thumbnail == thumbnail) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + id, + title, + const DeepCollectionEquality().hash(_artists), + duration, + thumbnail, + externalUri); + + /// Create a copy of SpotubeAudioSourceMatchObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeAudioSourceMatchObjectImplCopyWith< + _$SpotubeAudioSourceMatchObjectImpl> + get copyWith => __$$SpotubeAudioSourceMatchObjectImplCopyWithImpl< + _$SpotubeAudioSourceMatchObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeAudioSourceMatchObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeAudioSourceMatchObject + implements SpotubeAudioSourceMatchObject { + const factory _SpotubeAudioSourceMatchObject( + {required final String typeName, + required final String id, + required final String title, + required final List artists, + required final BigInt duration, + final String? thumbnail, + required final String externalUri}) = _$SpotubeAudioSourceMatchObjectImpl; + + factory _SpotubeAudioSourceMatchObject.fromJson(Map json) = + _$SpotubeAudioSourceMatchObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get title; + @override + List get artists; + @override + BigInt get duration; + @override + String? get thumbnail; + @override + String get externalUri; + + /// Create a copy of SpotubeAudioSourceMatchObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeAudioSourceMatchObjectImplCopyWith< + _$SpotubeAudioSourceMatchObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeAudioSourceStreamObject _$SpotubeAudioSourceStreamObjectFromJson( + Map json) { + return _SpotubeAudioSourceStreamObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeAudioSourceStreamObject { + String get typeName => throw _privateConstructorUsedError; + String get url => throw _privateConstructorUsedError; + String get container => throw _privateConstructorUsedError; + SpotubeMediaCompressionType get compressionType => + throw _privateConstructorUsedError; + String? get codec => throw _privateConstructorUsedError; + double? get bitrate => throw _privateConstructorUsedError; + int? get bitDepth => throw _privateConstructorUsedError; + double? get sampleRate => throw _privateConstructorUsedError; + + /// Serializes this SpotubeAudioSourceStreamObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeAudioSourceStreamObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeAudioSourceStreamObjectCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeAudioSourceStreamObjectCopyWith<$Res> { + factory $SpotubeAudioSourceStreamObjectCopyWith( + SpotubeAudioSourceStreamObject value, + $Res Function(SpotubeAudioSourceStreamObject) then) = + _$SpotubeAudioSourceStreamObjectCopyWithImpl<$Res, + SpotubeAudioSourceStreamObject>; + @useResult + $Res call( + {String typeName, + String url, + String container, + SpotubeMediaCompressionType compressionType, + String? codec, + double? bitrate, + int? bitDepth, + double? sampleRate}); +} + +/// @nodoc +class _$SpotubeAudioSourceStreamObjectCopyWithImpl<$Res, + $Val extends SpotubeAudioSourceStreamObject> + implements $SpotubeAudioSourceStreamObjectCopyWith<$Res> { + _$SpotubeAudioSourceStreamObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeAudioSourceStreamObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? url = null, + Object? container = null, + Object? compressionType = null, + Object? codec = freezed, + Object? bitrate = freezed, + Object? bitDepth = freezed, + Object? sampleRate = freezed, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + url: null == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String, + container: null == container + ? _value.container + : container // ignore: cast_nullable_to_non_nullable + as String, + compressionType: null == compressionType + ? _value.compressionType + : compressionType // ignore: cast_nullable_to_non_nullable + as SpotubeMediaCompressionType, + codec: freezed == codec + ? _value.codec + : codec // ignore: cast_nullable_to_non_nullable + as String?, + bitrate: freezed == bitrate + ? _value.bitrate + : bitrate // ignore: cast_nullable_to_non_nullable + as double?, + bitDepth: freezed == bitDepth + ? _value.bitDepth + : bitDepth // ignore: cast_nullable_to_non_nullable + as int?, + sampleRate: freezed == sampleRate + ? _value.sampleRate + : sampleRate // ignore: cast_nullable_to_non_nullable + as double?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeAudioSourceStreamObjectImplCopyWith<$Res> + implements $SpotubeAudioSourceStreamObjectCopyWith<$Res> { + factory _$$SpotubeAudioSourceStreamObjectImplCopyWith( + _$SpotubeAudioSourceStreamObjectImpl value, + $Res Function(_$SpotubeAudioSourceStreamObjectImpl) then) = + __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String url, + String container, + SpotubeMediaCompressionType compressionType, + String? codec, + double? bitrate, + int? bitDepth, + double? sampleRate}); +} + +/// @nodoc +class __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl<$Res> + extends _$SpotubeAudioSourceStreamObjectCopyWithImpl<$Res, + _$SpotubeAudioSourceStreamObjectImpl> + implements _$$SpotubeAudioSourceStreamObjectImplCopyWith<$Res> { + __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl( + _$SpotubeAudioSourceStreamObjectImpl _value, + $Res Function(_$SpotubeAudioSourceStreamObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeAudioSourceStreamObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? url = null, + Object? container = null, + Object? compressionType = null, + Object? codec = freezed, + Object? bitrate = freezed, + Object? bitDepth = freezed, + Object? sampleRate = freezed, + }) { + return _then(_$SpotubeAudioSourceStreamObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + url: null == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String, + container: null == container + ? _value.container + : container // ignore: cast_nullable_to_non_nullable + as String, + compressionType: null == compressionType + ? _value.compressionType + : compressionType // ignore: cast_nullable_to_non_nullable + as SpotubeMediaCompressionType, + codec: freezed == codec + ? _value.codec + : codec // ignore: cast_nullable_to_non_nullable + as String?, + bitrate: freezed == bitrate + ? _value.bitrate + : bitrate // ignore: cast_nullable_to_non_nullable + as double?, + bitDepth: freezed == bitDepth + ? _value.bitDepth + : bitDepth // ignore: cast_nullable_to_non_nullable + as int?, + sampleRate: freezed == sampleRate + ? _value.sampleRate + : sampleRate // ignore: cast_nullable_to_non_nullable + as double?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeAudioSourceStreamObjectImpl + implements _SpotubeAudioSourceStreamObject { + const _$SpotubeAudioSourceStreamObjectImpl( + {required this.typeName, + required this.url, + required this.container, + required this.compressionType, + this.codec, + this.bitrate, + this.bitDepth, + this.sampleRate}); + + factory _$SpotubeAudioSourceStreamObjectImpl.fromJson( + Map json) => + _$$SpotubeAudioSourceStreamObjectImplFromJson(json); + + @override + final String typeName; + @override + final String url; + @override + final String container; + @override + final SpotubeMediaCompressionType compressionType; + @override + final String? codec; + @override + final double? bitrate; + @override + final int? bitDepth; + @override + final double? sampleRate; + + @override + String toString() { + return 'SpotubeAudioSourceStreamObject(typeName: $typeName, url: $url, container: $container, compressionType: $compressionType, codec: $codec, bitrate: $bitrate, bitDepth: $bitDepth, sampleRate: $sampleRate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeAudioSourceStreamObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.url, url) || other.url == url) && + (identical(other.container, container) || + other.container == container) && + (identical(other.compressionType, compressionType) || + other.compressionType == compressionType) && + (identical(other.codec, codec) || other.codec == codec) && + (identical(other.bitrate, bitrate) || other.bitrate == bitrate) && + (identical(other.bitDepth, bitDepth) || + other.bitDepth == bitDepth) && + (identical(other.sampleRate, sampleRate) || + other.sampleRate == sampleRate)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, typeName, url, container, + compressionType, codec, bitrate, bitDepth, sampleRate); + + /// Create a copy of SpotubeAudioSourceStreamObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeAudioSourceStreamObjectImplCopyWith< + _$SpotubeAudioSourceStreamObjectImpl> + get copyWith => __$$SpotubeAudioSourceStreamObjectImplCopyWithImpl< + _$SpotubeAudioSourceStreamObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeAudioSourceStreamObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeAudioSourceStreamObject + implements SpotubeAudioSourceStreamObject { + const factory _SpotubeAudioSourceStreamObject( + {required final String typeName, + required final String url, + required final String container, + required final SpotubeMediaCompressionType compressionType, + final String? codec, + final double? bitrate, + final int? bitDepth, + final double? sampleRate}) = _$SpotubeAudioSourceStreamObjectImpl; + + factory _SpotubeAudioSourceStreamObject.fromJson(Map json) = + _$SpotubeAudioSourceStreamObjectImpl.fromJson; + + @override + String get typeName; + @override + String get url; + @override + String get container; + @override + SpotubeMediaCompressionType get compressionType; + @override + String? get codec; + @override + double? get bitrate; + @override + int? get bitDepth; + @override + double? get sampleRate; + + /// Create a copy of SpotubeAudioSourceStreamObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeAudioSourceStreamObjectImplCopyWith< + _$SpotubeAudioSourceStreamObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/audio_source.g.dart b/lib/src/rust/api/plugin/models/audio_source.g.dart new file mode 100644 index 00000000..51fe8ef0 --- /dev/null +++ b/lib/src/rust/api/plugin/models/audio_source.g.dart @@ -0,0 +1,138 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'audio_source.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeAudioLosslessContainerQualityImpl + _$$SpotubeAudioLosslessContainerQualityImplFromJson(Map json) => + _$SpotubeAudioLosslessContainerQualityImpl( + bitDepth: (json['bitDepth'] as num).toInt(), + sampleRate: (json['sampleRate'] as num).toInt(), + ); + +Map _$$SpotubeAudioLosslessContainerQualityImplToJson( + _$SpotubeAudioLosslessContainerQualityImpl instance) => + { + 'bitDepth': instance.bitDepth, + 'sampleRate': instance.sampleRate, + }; + +_$SpotubeAudioLossyContainerQualityImpl + _$$SpotubeAudioLossyContainerQualityImplFromJson(Map json) => + _$SpotubeAudioLossyContainerQualityImpl( + bitrate: (json['bitrate'] as num).toInt(), + ); + +Map _$$SpotubeAudioLossyContainerQualityImplToJson( + _$SpotubeAudioLossyContainerQualityImpl instance) => + { + 'bitrate': instance.bitrate, + }; + +_$SpotubeAudioSourceContainerPreset_LossyImpl + _$$SpotubeAudioSourceContainerPreset_LossyImplFromJson(Map json) => + _$SpotubeAudioSourceContainerPreset_LossyImpl( + compressionType: $enumDecode( + _$SpotubeMediaCompressionTypeEnumMap, json['compressionType']), + name: json['name'] as String, + qualities: (json['qualities'] as List) + .map((e) => SpotubeAudioLossyContainerQuality.fromJson( + Map.from(e as Map))) + .toList(), + $type: json['runtimeType'] as String?, + ); + +Map _$$SpotubeAudioSourceContainerPreset_LossyImplToJson( + _$SpotubeAudioSourceContainerPreset_LossyImpl instance) => + { + 'compressionType': + _$SpotubeMediaCompressionTypeEnumMap[instance.compressionType]!, + 'name': instance.name, + 'qualities': instance.qualities.map((e) => e.toJson()).toList(), + 'runtimeType': instance.$type, + }; + +const _$SpotubeMediaCompressionTypeEnumMap = { + SpotubeMediaCompressionType.lossy: 'lossy', + SpotubeMediaCompressionType.lossless: 'lossless', +}; + +_$SpotubeAudioSourceContainerPreset_LosslessImpl + _$$SpotubeAudioSourceContainerPreset_LosslessImplFromJson(Map json) => + _$SpotubeAudioSourceContainerPreset_LosslessImpl( + compressionType: $enumDecode( + _$SpotubeMediaCompressionTypeEnumMap, json['compressionType']), + name: json['name'] as String, + qualities: (json['qualities'] as List) + .map((e) => SpotubeAudioLosslessContainerQuality.fromJson( + Map.from(e as Map))) + .toList(), + $type: json['runtimeType'] as String?, + ); + +Map _$$SpotubeAudioSourceContainerPreset_LosslessImplToJson( + _$SpotubeAudioSourceContainerPreset_LosslessImpl instance) => + { + 'compressionType': + _$SpotubeMediaCompressionTypeEnumMap[instance.compressionType]!, + 'name': instance.name, + 'qualities': instance.qualities.map((e) => e.toJson()).toList(), + 'runtimeType': instance.$type, + }; + +_$SpotubeAudioSourceMatchObjectImpl + _$$SpotubeAudioSourceMatchObjectImplFromJson(Map json) => + _$SpotubeAudioSourceMatchObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + title: json['title'] as String, + artists: (json['artists'] as List) + .map((e) => e as String) + .toList(), + duration: BigInt.parse(json['duration'] as String), + thumbnail: json['thumbnail'] as String?, + externalUri: json['externalUri'] as String, + ); + +Map _$$SpotubeAudioSourceMatchObjectImplToJson( + _$SpotubeAudioSourceMatchObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'title': instance.title, + 'artists': instance.artists, + 'duration': instance.duration.toString(), + 'thumbnail': instance.thumbnail, + 'externalUri': instance.externalUri, + }; + +_$SpotubeAudioSourceStreamObjectImpl + _$$SpotubeAudioSourceStreamObjectImplFromJson(Map json) => + _$SpotubeAudioSourceStreamObjectImpl( + typeName: json['typeName'] as String, + url: json['url'] as String, + container: json['container'] as String, + compressionType: $enumDecode( + _$SpotubeMediaCompressionTypeEnumMap, json['compressionType']), + codec: json['codec'] as String?, + bitrate: (json['bitrate'] as num?)?.toDouble(), + bitDepth: (json['bitDepth'] as num?)?.toInt(), + sampleRate: (json['sampleRate'] as num?)?.toDouble(), + ); + +Map _$$SpotubeAudioSourceStreamObjectImplToJson( + _$SpotubeAudioSourceStreamObjectImpl instance) => + { + 'typeName': instance.typeName, + 'url': instance.url, + 'container': instance.container, + 'compressionType': + _$SpotubeMediaCompressionTypeEnumMap[instance.compressionType]!, + 'codec': instance.codec, + 'bitrate': instance.bitrate, + 'bitDepth': instance.bitDepth, + 'sampleRate': instance.sampleRate, + }; diff --git a/lib/src/rust/api/plugin/models/browse.dart b/lib/src/rust/api/plugin/models/browse.dart new file mode 100644 index 00000000..a5b44df7 --- /dev/null +++ b/lib/src/rust/api/plugin/models/browse.dart @@ -0,0 +1,57 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'album.dart'; +import 'artist.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +import 'playlist.dart'; +import 'track.dart'; +import 'user.dart'; +part 'browse.freezed.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `fmt`, `fmt` + +@freezed +sealed class SpotubeBrowseSectionObject with _$SpotubeBrowseSectionObject { + const factory SpotubeBrowseSectionObject({ + required String typeName, + required String id, + required String title, + required String externalUri, + required bool browseMore, + required List items, + }) = _SpotubeBrowseSectionObject; +} + +@freezed +sealed class SpotubeBrowseSectionResponseObjectItem + with _$SpotubeBrowseSectionResponseObjectItem { + const SpotubeBrowseSectionResponseObjectItem._(); + + const factory SpotubeBrowseSectionResponseObjectItem.track( + SpotubeTrackObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_Track; + const factory SpotubeBrowseSectionResponseObjectItem.playlistFull( + SpotubeFullPlaylistObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_PlaylistFull; + const factory SpotubeBrowseSectionResponseObjectItem.playlistSimple( + SpotubeSimplePlaylistObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_PlaylistSimple; + const factory SpotubeBrowseSectionResponseObjectItem.albumSimple( + SpotubeSimpleAlbumObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_AlbumSimple; + const factory SpotubeBrowseSectionResponseObjectItem.albumFull( + SpotubeFullAlbumObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_AlbumFull; + const factory SpotubeBrowseSectionResponseObjectItem.artistFull( + SpotubeFullArtistObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_ArtistFull; + const factory SpotubeBrowseSectionResponseObjectItem.artistSimple( + SpotubeSimpleArtistObject field0, + ) = SpotubeBrowseSectionResponseObjectItem_ArtistSimple; +} diff --git a/lib/src/rust/api/plugin/models/browse.freezed.dart b/lib/src/rust/api/plugin/models/browse.freezed.dart new file mode 100644 index 00000000..0d4741cb --- /dev/null +++ b/lib/src/rust/api/plugin/models/browse.freezed.dart @@ -0,0 +1,2047 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'browse.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$SpotubeBrowseSectionObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get title => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + bool get browseMore => throw _privateConstructorUsedError; + List get items => + throw _privateConstructorUsedError; + + /// Create a copy of SpotubeBrowseSectionObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeBrowseSectionObjectCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeBrowseSectionObjectCopyWith<$Res> { + factory $SpotubeBrowseSectionObjectCopyWith(SpotubeBrowseSectionObject value, + $Res Function(SpotubeBrowseSectionObject) then) = + _$SpotubeBrowseSectionObjectCopyWithImpl<$Res, + SpotubeBrowseSectionObject>; + @useResult + $Res call( + {String typeName, + String id, + String title, + String externalUri, + bool browseMore, + List items}); +} + +/// @nodoc +class _$SpotubeBrowseSectionObjectCopyWithImpl<$Res, + $Val extends SpotubeBrowseSectionObject> + implements $SpotubeBrowseSectionObjectCopyWith<$Res> { + _$SpotubeBrowseSectionObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeBrowseSectionObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? title = null, + Object? externalUri = null, + Object? browseMore = null, + Object? items = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + browseMore: null == browseMore + ? _value.browseMore + : browseMore // ignore: cast_nullable_to_non_nullable + as bool, + items: null == items + ? _value.items + : items // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionObjectImplCopyWith<$Res> + implements $SpotubeBrowseSectionObjectCopyWith<$Res> { + factory _$$SpotubeBrowseSectionObjectImplCopyWith( + _$SpotubeBrowseSectionObjectImpl value, + $Res Function(_$SpotubeBrowseSectionObjectImpl) then) = + __$$SpotubeBrowseSectionObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String title, + String externalUri, + bool browseMore, + List items}); +} + +/// @nodoc +class __$$SpotubeBrowseSectionObjectImplCopyWithImpl<$Res> + extends _$SpotubeBrowseSectionObjectCopyWithImpl<$Res, + _$SpotubeBrowseSectionObjectImpl> + implements _$$SpotubeBrowseSectionObjectImplCopyWith<$Res> { + __$$SpotubeBrowseSectionObjectImplCopyWithImpl( + _$SpotubeBrowseSectionObjectImpl _value, + $Res Function(_$SpotubeBrowseSectionObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? title = null, + Object? externalUri = null, + Object? browseMore = null, + Object? items = null, + }) { + return _then(_$SpotubeBrowseSectionObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + browseMore: null == browseMore + ? _value.browseMore + : browseMore // ignore: cast_nullable_to_non_nullable + as bool, + items: null == items + ? _value._items + : items // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionObjectImpl implements _SpotubeBrowseSectionObject { + const _$SpotubeBrowseSectionObjectImpl( + {required this.typeName, + required this.id, + required this.title, + required this.externalUri, + required this.browseMore, + required final List items}) + : _items = items; + + @override + final String typeName; + @override + final String id; + @override + final String title; + @override + final String externalUri; + @override + final bool browseMore; + final List _items; + @override + List get items { + if (_items is EqualUnmodifiableListView) return _items; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_items); + } + + @override + String toString() { + return 'SpotubeBrowseSectionObject(typeName: $typeName, id: $id, title: $title, externalUri: $externalUri, browseMore: $browseMore, items: $items)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeBrowseSectionObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.title, title) || other.title == title) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + (identical(other.browseMore, browseMore) || + other.browseMore == browseMore) && + const DeepCollectionEquality().equals(other._items, _items)); + } + + @override + int get hashCode => Object.hash(runtimeType, typeName, id, title, externalUri, + browseMore, const DeepCollectionEquality().hash(_items)); + + /// Create a copy of SpotubeBrowseSectionObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionObjectImplCopyWith<_$SpotubeBrowseSectionObjectImpl> + get copyWith => __$$SpotubeBrowseSectionObjectImplCopyWithImpl< + _$SpotubeBrowseSectionObjectImpl>(this, _$identity); +} + +abstract class _SpotubeBrowseSectionObject + implements SpotubeBrowseSectionObject { + const factory _SpotubeBrowseSectionObject( + {required final String typeName, + required final String id, + required final String title, + required final String externalUri, + required final bool browseMore, + required final List items}) = + _$SpotubeBrowseSectionObjectImpl; + + @override + String get typeName; + @override + String get id; + @override + String get title; + @override + String get externalUri; + @override + bool get browseMore; + @override + List get items; + + /// Create a copy of SpotubeBrowseSectionObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionObjectImplCopyWith<_$SpotubeBrowseSectionObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$SpotubeBrowseSectionResponseObjectItem { + Object get field0 => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeBrowseSectionResponseObjectItemCopyWith<$Res> { + factory $SpotubeBrowseSectionResponseObjectItemCopyWith( + SpotubeBrowseSectionResponseObjectItem value, + $Res Function(SpotubeBrowseSectionResponseObjectItem) then) = + _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + SpotubeBrowseSectionResponseObjectItem>; +} + +/// @nodoc +class _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + $Val extends SpotubeBrowseSectionResponseObjectItem> + implements $SpotubeBrowseSectionResponseObjectItemCopyWith<$Res> { + _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_TrackImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeTrackObject field0}); + + $SpotubeTrackObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl<$Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWith<$Res> { + __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_TrackImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_TrackImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeTrackObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeTrackObjectCopyWith<$Res> get field0 { + return $SpotubeTrackObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_TrackImpl + extends SpotubeBrowseSectionResponseObjectItem_Track { + const _$SpotubeBrowseSectionResponseObjectItem_TrackImpl(this.field0) + : super._(); + + @override + final SpotubeTrackObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.track(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeBrowseSectionResponseObjectItem_TrackImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return track(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return track?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (track != null) { + return track(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return track(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return track?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (track != null) { + return track(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_Track + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_Track( + final SpotubeTrackObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl; + const SpotubeBrowseSectionResponseObjectItem_Track._() : super._(); + + @override + SpotubeTrackObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_TrackImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_TrackImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl value, + $Res Function( + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeFullPlaylistObject field0}); + + $SpotubeFullPlaylistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWithImpl< + $Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWith< + $Res> { + __$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullPlaylistObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullPlaylistObjectCopyWith<$Res> get field0 { + return $SpotubeFullPlaylistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl + extends SpotubeBrowseSectionResponseObjectItem_PlaylistFull { + const _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl(this.field0) + : super._(); + + @override + final SpotubeFullPlaylistObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.playlistFull(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other + is _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return playlistFull(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return playlistFull?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (playlistFull != null) { + return playlistFull(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return playlistFull(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return playlistFull?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (playlistFull != null) { + return playlistFull(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_PlaylistFull + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_PlaylistFull( + final SpotubeFullPlaylistObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl; + const SpotubeBrowseSectionResponseObjectItem_PlaylistFull._() : super._(); + + @override + SpotubeFullPlaylistObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_PlaylistFullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl value, + $Res Function( + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeSimplePlaylistObject field0}); + + $SpotubeSimplePlaylistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWithImpl< + $Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWith< + $Res> { + __$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeSimplePlaylistObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimplePlaylistObjectCopyWith<$Res> get field0 { + return $SpotubeSimplePlaylistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl + extends SpotubeBrowseSectionResponseObjectItem_PlaylistSimple { + const _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl(this.field0) + : super._(); + + @override + final SpotubeSimplePlaylistObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.playlistSimple(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other + is _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return playlistSimple(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return playlistSimple?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (playlistSimple != null) { + return playlistSimple(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return playlistSimple(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return playlistSimple?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (playlistSimple != null) { + return playlistSimple(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_PlaylistSimple + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_PlaylistSimple( + final SpotubeSimplePlaylistObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl; + const SpotubeBrowseSectionResponseObjectItem_PlaylistSimple._() : super._(); + + @override + SpotubeSimplePlaylistObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_PlaylistSimpleImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl value, + $Res Function( + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeSimpleAlbumObject field0}); + + $SpotubeSimpleAlbumObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWithImpl< + $Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWith< + $Res> { + __$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleAlbumObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimpleAlbumObjectCopyWith<$Res> get field0 { + return $SpotubeSimpleAlbumObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl + extends SpotubeBrowseSectionResponseObjectItem_AlbumSimple { + const _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl(this.field0) + : super._(); + + @override + final SpotubeSimpleAlbumObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.albumSimple(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return albumSimple(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return albumSimple?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (albumSimple != null) { + return albumSimple(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return albumSimple(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return albumSimple?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (albumSimple != null) { + return albumSimple(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_AlbumSimple + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_AlbumSimple( + final SpotubeSimpleAlbumObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl; + const SpotubeBrowseSectionResponseObjectItem_AlbumSimple._() : super._(); + + @override + SpotubeSimpleAlbumObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_AlbumSimpleImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeFullAlbumObject field0}); + + $SpotubeFullAlbumObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWithImpl<$Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWith<$Res> { + __$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullAlbumObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullAlbumObjectCopyWith<$Res> get field0 { + return $SpotubeFullAlbumObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl + extends SpotubeBrowseSectionResponseObjectItem_AlbumFull { + const _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl(this.field0) + : super._(); + + @override + final SpotubeFullAlbumObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.albumFull(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return albumFull(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return albumFull?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (albumFull != null) { + return albumFull(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return albumFull(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return albumFull?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (albumFull != null) { + return albumFull(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_AlbumFull + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_AlbumFull( + final SpotubeFullAlbumObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl; + const SpotubeBrowseSectionResponseObjectItem_AlbumFull._() : super._(); + + @override + SpotubeFullAlbumObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_AlbumFullImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_AlbumFullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeFullArtistObject field0}); + + $SpotubeFullArtistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWithImpl< + $Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWith<$Res> { + __$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullArtistObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullArtistObjectCopyWith<$Res> get field0 { + return $SpotubeFullArtistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl + extends SpotubeBrowseSectionResponseObjectItem_ArtistFull { + const _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl(this.field0) + : super._(); + + @override + final SpotubeFullArtistObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.artistFull(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return artistFull(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return artistFull?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (artistFull != null) { + return artistFull(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return artistFull(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return artistFull?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (artistFull != null) { + return artistFull(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_ArtistFull + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_ArtistFull( + final SpotubeFullArtistObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl; + const SpotubeBrowseSectionResponseObjectItem_ArtistFull._() : super._(); + + @override + SpotubeFullArtistObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_ArtistFullImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_ArtistFullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWith< + $Res> { + factory _$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWith( + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl value, + $Res Function( + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl) + then) = + __$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeSimpleArtistObject field0}); + + $SpotubeSimpleArtistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWithImpl< + $Res> + extends _$SpotubeBrowseSectionResponseObjectItemCopyWithImpl<$Res, + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl> + implements + _$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWith< + $Res> { + __$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWithImpl( + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl _value, + $Res Function(_$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleArtistObject, + )); + } + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimpleArtistObjectCopyWith<$Res> get field0 { + return $SpotubeSimpleArtistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl + extends SpotubeBrowseSectionResponseObjectItem_ArtistSimple { + const _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl(this.field0) + : super._(); + + @override + final SpotubeSimpleArtistObject field0; + + @override + String toString() { + return 'SpotubeBrowseSectionResponseObjectItem.artistSimple(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other + is _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl> + get copyWith => + __$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWithImpl< + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + }) { + return artistSimple(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + }) { + return artistSimple?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + required TResult orElse(), + }) { + if (artistSimple != null) { + return artistSimple(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_Track value) + track, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value) + artistSimple, + }) { + return artistSimple(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubeBrowseSectionResponseObjectItem_Track value)? + track, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function( + SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + }) { + return artistSimple?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubeBrowseSectionResponseObjectItem_Track value)? track, + TResult Function(SpotubeBrowseSectionResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function( + SpotubeBrowseSectionResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubeBrowseSectionResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubeBrowseSectionResponseObjectItem_ArtistSimple value)? + artistSimple, + required TResult orElse(), + }) { + if (artistSimple != null) { + return artistSimple(this); + } + return orElse(); + } +} + +abstract class SpotubeBrowseSectionResponseObjectItem_ArtistSimple + extends SpotubeBrowseSectionResponseObjectItem { + const factory SpotubeBrowseSectionResponseObjectItem_ArtistSimple( + final SpotubeSimpleArtistObject field0) = + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl; + const SpotubeBrowseSectionResponseObjectItem_ArtistSimple._() : super._(); + + @override + SpotubeSimpleArtistObject get field0; + + /// Create a copy of SpotubeBrowseSectionResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImplCopyWith< + _$SpotubeBrowseSectionResponseObjectItem_ArtistSimpleImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/core.dart b/lib/src/rust/api/plugin/models/core.dart new file mode 100644 index 00000000..7dce7d94 --- /dev/null +++ b/lib/src/rust/api/plugin/models/core.dart @@ -0,0 +1,190 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `assert_receiver_is_total_eq`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `clone`, `cmp`, `cmp`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `eq`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `fmt`, `partial_cmp`, `partial_cmp` + +enum PluginAbility { + authentication, + scrobbling, + metadata, + audioSource, + ; +} + +enum PluginApi { + webview, + localstorage, + timezone, + ; +} + +class PluginConfiguration { + final String name; + final String description; + final String version; + final String author; + final String entryPoint; + final String pluginApiVersion; + final List apis; + final List abilities; + final String? repository; + + const PluginConfiguration({ + required this.name, + required this.description, + required this.version, + required this.author, + required this.entryPoint, + required this.pluginApiVersion, + required this.apis, + required this.abilities, + this.repository, + }); + + Future slug() => + RustLib.instance.api.crateApiPluginModelsCorePluginConfigurationSlug( + that: this, + ); + + @override + int get hashCode => + name.hashCode ^ + description.hashCode ^ + version.hashCode ^ + author.hashCode ^ + entryPoint.hashCode ^ + pluginApiVersion.hashCode ^ + apis.hashCode ^ + abilities.hashCode ^ + repository.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginConfiguration && + runtimeType == other.runtimeType && + name == other.name && + description == other.description && + version == other.version && + author == other.author && + entryPoint == other.entryPoint && + pluginApiVersion == other.pluginApiVersion && + apis == other.apis && + abilities == other.abilities && + repository == other.repository; +} + +class PluginUpdateAvailable { + final String downloadUrl; + final String version; + final String? changelog; + + const PluginUpdateAvailable({ + required this.downloadUrl, + required this.version, + this.changelog, + }); + + @override + int get hashCode => + downloadUrl.hashCode ^ version.hashCode ^ changelog.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginUpdateAvailable && + runtimeType == other.runtimeType && + downloadUrl == other.downloadUrl && + version == other.version && + changelog == other.changelog; +} + +class ScrobbleAlbum { + final String id; + final String name; + + const ScrobbleAlbum({ + required this.id, + required this.name, + }); + + @override + int get hashCode => id.hashCode ^ name.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ScrobbleAlbum && + runtimeType == other.runtimeType && + id == other.id && + name == other.name; +} + +class ScrobbleArtist { + final String id; + final String name; + + const ScrobbleArtist({ + required this.id, + required this.name, + }); + + @override + int get hashCode => id.hashCode ^ name.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ScrobbleArtist && + runtimeType == other.runtimeType && + id == other.id && + name == other.name; +} + +class ScrobbleDetails { + final String id; + final String title; + final List artists; + final ScrobbleAlbum album; + final PlatformInt64? timestamp; + final int? durationMs; + final String? isrc; + + const ScrobbleDetails({ + required this.id, + required this.title, + required this.artists, + required this.album, + this.timestamp, + this.durationMs, + this.isrc, + }); + + @override + int get hashCode => + id.hashCode ^ + title.hashCode ^ + artists.hashCode ^ + album.hashCode ^ + timestamp.hashCode ^ + durationMs.hashCode ^ + isrc.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ScrobbleDetails && + runtimeType == other.runtimeType && + id == other.id && + title == other.title && + artists == other.artists && + album == other.album && + timestamp == other.timestamp && + durationMs == other.durationMs && + isrc == other.isrc; +} diff --git a/lib/src/rust/api/plugin/models/image.dart b/lib/src/rust/api/plugin/models/image.dart new file mode 100644 index 00000000..933f6c04 --- /dev/null +++ b/lib/src/rust/api/plugin/models/image.dart @@ -0,0 +1,25 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'image.freezed.dart'; +part 'image.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt` + +@freezed +sealed class SpotubeImageObject with _$SpotubeImageObject { + const factory SpotubeImageObject({ + required String typeName, + required String url, + int? width, + int? height, + }) = _SpotubeImageObject; + + factory SpotubeImageObject.fromJson(Map json) => + _$SpotubeImageObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/image.freezed.dart b/lib/src/rust/api/plugin/models/image.freezed.dart new file mode 100644 index 00000000..eddf5c64 --- /dev/null +++ b/lib/src/rust/api/plugin/models/image.freezed.dart @@ -0,0 +1,219 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'image.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeImageObject _$SpotubeImageObjectFromJson(Map json) { + return _SpotubeImageObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeImageObject { + String get typeName => throw _privateConstructorUsedError; + String get url => throw _privateConstructorUsedError; + int? get width => throw _privateConstructorUsedError; + int? get height => throw _privateConstructorUsedError; + + /// Serializes this SpotubeImageObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeImageObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeImageObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeImageObjectCopyWith<$Res> { + factory $SpotubeImageObjectCopyWith( + SpotubeImageObject value, $Res Function(SpotubeImageObject) then) = + _$SpotubeImageObjectCopyWithImpl<$Res, SpotubeImageObject>; + @useResult + $Res call({String typeName, String url, int? width, int? height}); +} + +/// @nodoc +class _$SpotubeImageObjectCopyWithImpl<$Res, $Val extends SpotubeImageObject> + implements $SpotubeImageObjectCopyWith<$Res> { + _$SpotubeImageObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeImageObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? url = null, + Object? width = freezed, + Object? height = freezed, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + url: null == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String, + width: freezed == width + ? _value.width + : width // ignore: cast_nullable_to_non_nullable + as int?, + height: freezed == height + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as int?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeImageObjectImplCopyWith<$Res> + implements $SpotubeImageObjectCopyWith<$Res> { + factory _$$SpotubeImageObjectImplCopyWith(_$SpotubeImageObjectImpl value, + $Res Function(_$SpotubeImageObjectImpl) then) = + __$$SpotubeImageObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({String typeName, String url, int? width, int? height}); +} + +/// @nodoc +class __$$SpotubeImageObjectImplCopyWithImpl<$Res> + extends _$SpotubeImageObjectCopyWithImpl<$Res, _$SpotubeImageObjectImpl> + implements _$$SpotubeImageObjectImplCopyWith<$Res> { + __$$SpotubeImageObjectImplCopyWithImpl(_$SpotubeImageObjectImpl _value, + $Res Function(_$SpotubeImageObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeImageObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? url = null, + Object? width = freezed, + Object? height = freezed, + }) { + return _then(_$SpotubeImageObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + url: null == url + ? _value.url + : url // ignore: cast_nullable_to_non_nullable + as String, + width: freezed == width + ? _value.width + : width // ignore: cast_nullable_to_non_nullable + as int?, + height: freezed == height + ? _value.height + : height // ignore: cast_nullable_to_non_nullable + as int?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeImageObjectImpl implements _SpotubeImageObject { + const _$SpotubeImageObjectImpl( + {required this.typeName, required this.url, this.width, this.height}); + + factory _$SpotubeImageObjectImpl.fromJson(Map json) => + _$$SpotubeImageObjectImplFromJson(json); + + @override + final String typeName; + @override + final String url; + @override + final int? width; + @override + final int? height; + + @override + String toString() { + return 'SpotubeImageObject(typeName: $typeName, url: $url, width: $width, height: $height)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeImageObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.url, url) || other.url == url) && + (identical(other.width, width) || other.width == width) && + (identical(other.height, height) || other.height == height)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, typeName, url, width, height); + + /// Create a copy of SpotubeImageObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeImageObjectImplCopyWith<_$SpotubeImageObjectImpl> get copyWith => + __$$SpotubeImageObjectImplCopyWithImpl<_$SpotubeImageObjectImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$SpotubeImageObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeImageObject implements SpotubeImageObject { + const factory _SpotubeImageObject( + {required final String typeName, + required final String url, + final int? width, + final int? height}) = _$SpotubeImageObjectImpl; + + factory _SpotubeImageObject.fromJson(Map json) = + _$SpotubeImageObjectImpl.fromJson; + + @override + String get typeName; + @override + String get url; + @override + int? get width; + @override + int? get height; + + /// Create a copy of SpotubeImageObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeImageObjectImplCopyWith<_$SpotubeImageObjectImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/image.g.dart b/lib/src/rust/api/plugin/models/image.g.dart new file mode 100644 index 00000000..23561efb --- /dev/null +++ b/lib/src/rust/api/plugin/models/image.g.dart @@ -0,0 +1,24 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'image.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeImageObjectImpl _$$SpotubeImageObjectImplFromJson(Map json) => + _$SpotubeImageObjectImpl( + typeName: json['typeName'] as String, + url: json['url'] as String, + width: (json['width'] as num?)?.toInt(), + height: (json['height'] as num?)?.toInt(), + ); + +Map _$$SpotubeImageObjectImplToJson( + _$SpotubeImageObjectImpl instance) => + { + 'typeName': instance.typeName, + 'url': instance.url, + 'width': instance.width, + 'height': instance.height, + }; diff --git a/lib/src/rust/api/plugin/models/pagination.dart b/lib/src/rust/api/plugin/models/pagination.dart new file mode 100644 index 00000000..653a7391 --- /dev/null +++ b/lib/src/rust/api/plugin/models/pagination.dart @@ -0,0 +1,61 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'album.dart'; +import 'artist.dart'; +import 'browse.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +import 'playlist.dart'; +import 'track.dart'; +import 'user.dart'; +part 'pagination.freezed.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `fmt`, `fmt` + +@freezed +sealed class SpotubePaginationResponseObject + with _$SpotubePaginationResponseObject { + const factory SpotubePaginationResponseObject({ + required int limit, + int? nextOffset, + required int total, + required bool hasMore, + required List items, + }) = _SpotubePaginationResponseObject; +} + +@freezed +sealed class SpotubePaginationResponseObjectItem + with _$SpotubePaginationResponseObjectItem { + const SpotubePaginationResponseObjectItem._(); + + const factory SpotubePaginationResponseObjectItem.track( + SpotubeTrackObject field0, + ) = SpotubePaginationResponseObjectItem_Track; + const factory SpotubePaginationResponseObjectItem.playlistFull( + SpotubeFullPlaylistObject field0, + ) = SpotubePaginationResponseObjectItem_PlaylistFull; + const factory SpotubePaginationResponseObjectItem.playlistSimple( + SpotubeSimplePlaylistObject field0, + ) = SpotubePaginationResponseObjectItem_PlaylistSimple; + const factory SpotubePaginationResponseObjectItem.albumSimple( + SpotubeSimpleAlbumObject field0, + ) = SpotubePaginationResponseObjectItem_AlbumSimple; + const factory SpotubePaginationResponseObjectItem.albumFull( + SpotubeFullAlbumObject field0, + ) = SpotubePaginationResponseObjectItem_AlbumFull; + const factory SpotubePaginationResponseObjectItem.artistFull( + SpotubeFullArtistObject field0, + ) = SpotubePaginationResponseObjectItem_ArtistFull; + const factory SpotubePaginationResponseObjectItem.artistSimple( + SpotubeSimpleArtistObject field0, + ) = SpotubePaginationResponseObjectItem_ArtistSimple; + const factory SpotubePaginationResponseObjectItem.browseSection( + SpotubeBrowseSectionObject field0, + ) = SpotubePaginationResponseObjectItem_BrowseSection; +} diff --git a/lib/src/rust/api/plugin/models/pagination.freezed.dart b/lib/src/rust/api/plugin/models/pagination.freezed.dart new file mode 100644 index 00000000..b08464c8 --- /dev/null +++ b/lib/src/rust/api/plugin/models/pagination.freezed.dart @@ -0,0 +1,2279 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'pagination.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$SpotubePaginationResponseObject { + int get limit => throw _privateConstructorUsedError; + int? get nextOffset => throw _privateConstructorUsedError; + int get total => throw _privateConstructorUsedError; + bool get hasMore => throw _privateConstructorUsedError; + List get items => + throw _privateConstructorUsedError; + + /// Create a copy of SpotubePaginationResponseObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubePaginationResponseObjectCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubePaginationResponseObjectCopyWith<$Res> { + factory $SpotubePaginationResponseObjectCopyWith( + SpotubePaginationResponseObject value, + $Res Function(SpotubePaginationResponseObject) then) = + _$SpotubePaginationResponseObjectCopyWithImpl<$Res, + SpotubePaginationResponseObject>; + @useResult + $Res call( + {int limit, + int? nextOffset, + int total, + bool hasMore, + List items}); +} + +/// @nodoc +class _$SpotubePaginationResponseObjectCopyWithImpl<$Res, + $Val extends SpotubePaginationResponseObject> + implements $SpotubePaginationResponseObjectCopyWith<$Res> { + _$SpotubePaginationResponseObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubePaginationResponseObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? limit = null, + Object? nextOffset = freezed, + Object? total = null, + Object? hasMore = null, + Object? items = null, + }) { + return _then(_value.copyWith( + limit: null == limit + ? _value.limit + : limit // ignore: cast_nullable_to_non_nullable + as int, + nextOffset: freezed == nextOffset + ? _value.nextOffset + : nextOffset // ignore: cast_nullable_to_non_nullable + as int?, + total: null == total + ? _value.total + : total // ignore: cast_nullable_to_non_nullable + as int, + hasMore: null == hasMore + ? _value.hasMore + : hasMore // ignore: cast_nullable_to_non_nullable + as bool, + items: null == items + ? _value.items + : items // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectImplCopyWith<$Res> + implements $SpotubePaginationResponseObjectCopyWith<$Res> { + factory _$$SpotubePaginationResponseObjectImplCopyWith( + _$SpotubePaginationResponseObjectImpl value, + $Res Function(_$SpotubePaginationResponseObjectImpl) then) = + __$$SpotubePaginationResponseObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int limit, + int? nextOffset, + int total, + bool hasMore, + List items}); +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectImpl> + implements _$$SpotubePaginationResponseObjectImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectImplCopyWithImpl( + _$SpotubePaginationResponseObjectImpl _value, + $Res Function(_$SpotubePaginationResponseObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? limit = null, + Object? nextOffset = freezed, + Object? total = null, + Object? hasMore = null, + Object? items = null, + }) { + return _then(_$SpotubePaginationResponseObjectImpl( + limit: null == limit + ? _value.limit + : limit // ignore: cast_nullable_to_non_nullable + as int, + nextOffset: freezed == nextOffset + ? _value.nextOffset + : nextOffset // ignore: cast_nullable_to_non_nullable + as int?, + total: null == total + ? _value.total + : total // ignore: cast_nullable_to_non_nullable + as int, + hasMore: null == hasMore + ? _value.hasMore + : hasMore // ignore: cast_nullable_to_non_nullable + as bool, + items: null == items + ? _value._items + : items // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectImpl + implements _SpotubePaginationResponseObject { + const _$SpotubePaginationResponseObjectImpl( + {required this.limit, + this.nextOffset, + required this.total, + required this.hasMore, + required final List items}) + : _items = items; + + @override + final int limit; + @override + final int? nextOffset; + @override + final int total; + @override + final bool hasMore; + final List _items; + @override + List get items { + if (_items is EqualUnmodifiableListView) return _items; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_items); + } + + @override + String toString() { + return 'SpotubePaginationResponseObject(limit: $limit, nextOffset: $nextOffset, total: $total, hasMore: $hasMore, items: $items)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectImpl && + (identical(other.limit, limit) || other.limit == limit) && + (identical(other.nextOffset, nextOffset) || + other.nextOffset == nextOffset) && + (identical(other.total, total) || other.total == total) && + (identical(other.hasMore, hasMore) || other.hasMore == hasMore) && + const DeepCollectionEquality().equals(other._items, _items)); + } + + @override + int get hashCode => Object.hash(runtimeType, limit, nextOffset, total, + hasMore, const DeepCollectionEquality().hash(_items)); + + /// Create a copy of SpotubePaginationResponseObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectImplCopyWith< + _$SpotubePaginationResponseObjectImpl> + get copyWith => __$$SpotubePaginationResponseObjectImplCopyWithImpl< + _$SpotubePaginationResponseObjectImpl>(this, _$identity); +} + +abstract class _SpotubePaginationResponseObject + implements SpotubePaginationResponseObject { + const factory _SpotubePaginationResponseObject( + {required final int limit, + final int? nextOffset, + required final int total, + required final bool hasMore, + required final List items}) = + _$SpotubePaginationResponseObjectImpl; + + @override + int get limit; + @override + int? get nextOffset; + @override + int get total; + @override + bool get hasMore; + @override + List get items; + + /// Create a copy of SpotubePaginationResponseObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectImplCopyWith< + _$SpotubePaginationResponseObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$SpotubePaginationResponseObjectItem { + Object get field0 => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubePaginationResponseObjectItemCopyWith<$Res> { + factory $SpotubePaginationResponseObjectItemCopyWith( + SpotubePaginationResponseObjectItem value, + $Res Function(SpotubePaginationResponseObjectItem) then) = + _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + SpotubePaginationResponseObjectItem>; +} + +/// @nodoc +class _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + $Val extends SpotubePaginationResponseObjectItem> + implements $SpotubePaginationResponseObjectItemCopyWith<$Res> { + _$SpotubePaginationResponseObjectItemCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_TrackImplCopyWith<$Res> { + factory _$$SpotubePaginationResponseObjectItem_TrackImplCopyWith( + _$SpotubePaginationResponseObjectItem_TrackImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_TrackImpl) then) = + __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeTrackObject field0}); + + $SpotubeTrackObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_TrackImpl> + implements _$$SpotubePaginationResponseObjectItem_TrackImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_TrackImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_TrackImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_TrackImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeTrackObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeTrackObjectCopyWith<$Res> get field0 { + return $SpotubeTrackObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_TrackImpl + extends SpotubePaginationResponseObjectItem_Track { + const _$SpotubePaginationResponseObjectItem_TrackImpl(this.field0) + : super._(); + + @override + final SpotubeTrackObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.track(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_TrackImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_TrackImplCopyWith< + _$SpotubePaginationResponseObjectItem_TrackImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_TrackImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_TrackImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return track(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return track?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (track != null) { + return track(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return track(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return track?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (track != null) { + return track(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_Track + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_Track( + final SpotubeTrackObject field0) = + _$SpotubePaginationResponseObjectItem_TrackImpl; + const SpotubePaginationResponseObjectItem_Track._() : super._(); + + @override + SpotubeTrackObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_TrackImplCopyWith< + _$SpotubePaginationResponseObjectItem_TrackImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWith( + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_PlaylistFullImpl) + then) = + __$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeFullPlaylistObject field0}); + + $SpotubeFullPlaylistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl> + implements + _$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_PlaylistFullImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_PlaylistFullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullPlaylistObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullPlaylistObjectCopyWith<$Res> get field0 { + return $SpotubeFullPlaylistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_PlaylistFullImpl + extends SpotubePaginationResponseObjectItem_PlaylistFull { + const _$SpotubePaginationResponseObjectItem_PlaylistFullImpl(this.field0) + : super._(); + + @override + final SpotubeFullPlaylistObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.playlistFull(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_PlaylistFullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWith< + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return playlistFull(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return playlistFull?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (playlistFull != null) { + return playlistFull(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return playlistFull(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return playlistFull?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (playlistFull != null) { + return playlistFull(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_PlaylistFull + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_PlaylistFull( + final SpotubeFullPlaylistObject field0) = + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl; + const SpotubePaginationResponseObjectItem_PlaylistFull._() : super._(); + + @override + SpotubeFullPlaylistObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_PlaylistFullImplCopyWith< + _$SpotubePaginationResponseObjectItem_PlaylistFullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWith( + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl value, + $Res Function( + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl) + then) = + __$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeSimplePlaylistObject field0}); + + $SpotubeSimplePlaylistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWithImpl< + $Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl> + implements + _$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWith< + $Res> { + __$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeSimplePlaylistObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimplePlaylistObjectCopyWith<$Res> get field0 { + return $SpotubeSimplePlaylistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl + extends SpotubePaginationResponseObjectItem_PlaylistSimple { + const _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl(this.field0) + : super._(); + + @override + final SpotubeSimplePlaylistObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.playlistSimple(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWith< + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return playlistSimple(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return playlistSimple?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (playlistSimple != null) { + return playlistSimple(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return playlistSimple(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return playlistSimple?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (playlistSimple != null) { + return playlistSimple(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_PlaylistSimple + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_PlaylistSimple( + final SpotubeSimplePlaylistObject field0) = + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl; + const SpotubePaginationResponseObjectItem_PlaylistSimple._() : super._(); + + @override + SpotubeSimplePlaylistObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_PlaylistSimpleImplCopyWith< + _$SpotubePaginationResponseObjectItem_PlaylistSimpleImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWith( + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_AlbumSimpleImpl) + then) = + __$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeSimpleAlbumObject field0}); + + $SpotubeSimpleAlbumObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl> + implements + _$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_AlbumSimpleImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_AlbumSimpleImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleAlbumObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimpleAlbumObjectCopyWith<$Res> get field0 { + return $SpotubeSimpleAlbumObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl + extends SpotubePaginationResponseObjectItem_AlbumSimple { + const _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl(this.field0) + : super._(); + + @override + final SpotubeSimpleAlbumObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.albumSimple(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWith< + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return albumSimple(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return albumSimple?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (albumSimple != null) { + return albumSimple(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return albumSimple(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return albumSimple?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (albumSimple != null) { + return albumSimple(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_AlbumSimple + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_AlbumSimple( + final SpotubeSimpleAlbumObject field0) = + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl; + const SpotubePaginationResponseObjectItem_AlbumSimple._() : super._(); + + @override + SpotubeSimpleAlbumObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_AlbumSimpleImplCopyWith< + _$SpotubePaginationResponseObjectItem_AlbumSimpleImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWith( + _$SpotubePaginationResponseObjectItem_AlbumFullImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_AlbumFullImpl) + then) = + __$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeFullAlbumObject field0}); + + $SpotubeFullAlbumObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_AlbumFullImpl> + implements + _$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_AlbumFullImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_AlbumFullImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_AlbumFullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullAlbumObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullAlbumObjectCopyWith<$Res> get field0 { + return $SpotubeFullAlbumObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_AlbumFullImpl + extends SpotubePaginationResponseObjectItem_AlbumFull { + const _$SpotubePaginationResponseObjectItem_AlbumFullImpl(this.field0) + : super._(); + + @override + final SpotubeFullAlbumObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.albumFull(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_AlbumFullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWith< + _$SpotubePaginationResponseObjectItem_AlbumFullImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_AlbumFullImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return albumFull(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return albumFull?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (albumFull != null) { + return albumFull(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return albumFull(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return albumFull?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (albumFull != null) { + return albumFull(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_AlbumFull + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_AlbumFull( + final SpotubeFullAlbumObject field0) = + _$SpotubePaginationResponseObjectItem_AlbumFullImpl; + const SpotubePaginationResponseObjectItem_AlbumFull._() : super._(); + + @override + SpotubeFullAlbumObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_AlbumFullImplCopyWith< + _$SpotubePaginationResponseObjectItem_AlbumFullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWith( + _$SpotubePaginationResponseObjectItem_ArtistFullImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_ArtistFullImpl) + then) = + __$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWithImpl<$Res>; + @useResult + $Res call({SpotubeFullArtistObject field0}); + + $SpotubeFullArtistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_ArtistFullImpl> + implements + _$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_ArtistFullImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_ArtistFullImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_ArtistFullImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeFullArtistObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeFullArtistObjectCopyWith<$Res> get field0 { + return $SpotubeFullArtistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_ArtistFullImpl + extends SpotubePaginationResponseObjectItem_ArtistFull { + const _$SpotubePaginationResponseObjectItem_ArtistFullImpl(this.field0) + : super._(); + + @override + final SpotubeFullArtistObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.artistFull(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_ArtistFullImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWith< + _$SpotubePaginationResponseObjectItem_ArtistFullImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_ArtistFullImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return artistFull(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return artistFull?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (artistFull != null) { + return artistFull(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return artistFull(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return artistFull?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (artistFull != null) { + return artistFull(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_ArtistFull + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_ArtistFull( + final SpotubeFullArtistObject field0) = + _$SpotubePaginationResponseObjectItem_ArtistFullImpl; + const SpotubePaginationResponseObjectItem_ArtistFull._() : super._(); + + @override + SpotubeFullArtistObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_ArtistFullImplCopyWith< + _$SpotubePaginationResponseObjectItem_ArtistFullImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWith( + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_ArtistSimpleImpl) + then) = + __$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeSimpleArtistObject field0}); + + $SpotubeSimpleArtistObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWithImpl<$Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl> + implements + _$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_ArtistSimpleImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_ArtistSimpleImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleArtistObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimpleArtistObjectCopyWith<$Res> get field0 { + return $SpotubeSimpleArtistObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl + extends SpotubePaginationResponseObjectItem_ArtistSimple { + const _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl(this.field0) + : super._(); + + @override + final SpotubeSimpleArtistObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.artistSimple(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWith< + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return artistSimple(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return artistSimple?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (artistSimple != null) { + return artistSimple(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return artistSimple(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return artistSimple?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (artistSimple != null) { + return artistSimple(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_ArtistSimple + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_ArtistSimple( + final SpotubeSimpleArtistObject field0) = + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl; + const SpotubePaginationResponseObjectItem_ArtistSimple._() : super._(); + + @override + SpotubeSimpleArtistObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_ArtistSimpleImplCopyWith< + _$SpotubePaginationResponseObjectItem_ArtistSimpleImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWith< + $Res> { + factory _$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWith( + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl value, + $Res Function(_$SpotubePaginationResponseObjectItem_BrowseSectionImpl) + then) = + __$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWithImpl< + $Res>; + @useResult + $Res call({SpotubeBrowseSectionObject field0}); + + $SpotubeBrowseSectionObjectCopyWith<$Res> get field0; +} + +/// @nodoc +class __$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWithImpl< + $Res> + extends _$SpotubePaginationResponseObjectItemCopyWithImpl<$Res, + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl> + implements + _$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWith<$Res> { + __$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWithImpl( + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl _value, + $Res Function(_$SpotubePaginationResponseObjectItem_BrowseSectionImpl) + _then) + : super(_value, _then); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? field0 = null, + }) { + return _then(_$SpotubePaginationResponseObjectItem_BrowseSectionImpl( + null == field0 + ? _value.field0 + : field0 // ignore: cast_nullable_to_non_nullable + as SpotubeBrowseSectionObject, + )); + } + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeBrowseSectionObjectCopyWith<$Res> get field0 { + return $SpotubeBrowseSectionObjectCopyWith<$Res>(_value.field0, (value) { + return _then(_value.copyWith(field0: value)); + }); + } +} + +/// @nodoc + +class _$SpotubePaginationResponseObjectItem_BrowseSectionImpl + extends SpotubePaginationResponseObjectItem_BrowseSection { + const _$SpotubePaginationResponseObjectItem_BrowseSectionImpl(this.field0) + : super._(); + + @override + final SpotubeBrowseSectionObject field0; + + @override + String toString() { + return 'SpotubePaginationResponseObjectItem.browseSection(field0: $field0)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubePaginationResponseObjectItem_BrowseSectionImpl && + (identical(other.field0, field0) || other.field0 == field0)); + } + + @override + int get hashCode => Object.hash(runtimeType, field0); + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWith< + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl> + get copyWith => + __$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWithImpl< + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(SpotubeTrackObject field0) track, + required TResult Function(SpotubeFullPlaylistObject field0) playlistFull, + required TResult Function(SpotubeSimplePlaylistObject field0) + playlistSimple, + required TResult Function(SpotubeSimpleAlbumObject field0) albumSimple, + required TResult Function(SpotubeFullAlbumObject field0) albumFull, + required TResult Function(SpotubeFullArtistObject field0) artistFull, + required TResult Function(SpotubeSimpleArtistObject field0) artistSimple, + required TResult Function(SpotubeBrowseSectionObject field0) browseSection, + }) { + return browseSection(field0); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(SpotubeTrackObject field0)? track, + TResult? Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult? Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult? Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult? Function(SpotubeFullAlbumObject field0)? albumFull, + TResult? Function(SpotubeFullArtistObject field0)? artistFull, + TResult? Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult? Function(SpotubeBrowseSectionObject field0)? browseSection, + }) { + return browseSection?.call(field0); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(SpotubeTrackObject field0)? track, + TResult Function(SpotubeFullPlaylistObject field0)? playlistFull, + TResult Function(SpotubeSimplePlaylistObject field0)? playlistSimple, + TResult Function(SpotubeSimpleAlbumObject field0)? albumSimple, + TResult Function(SpotubeFullAlbumObject field0)? albumFull, + TResult Function(SpotubeFullArtistObject field0)? artistFull, + TResult Function(SpotubeSimpleArtistObject field0)? artistSimple, + TResult Function(SpotubeBrowseSectionObject field0)? browseSection, + required TResult orElse(), + }) { + if (browseSection != null) { + return browseSection(field0); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(SpotubePaginationResponseObjectItem_Track value) + track, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistFull value) + playlistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_PlaylistSimple value) + playlistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumSimple value) + albumSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_AlbumFull value) + albumFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistFull value) + artistFull, + required TResult Function( + SpotubePaginationResponseObjectItem_ArtistSimple value) + artistSimple, + required TResult Function( + SpotubePaginationResponseObjectItem_BrowseSection value) + browseSection, + }) { + return browseSection(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult? Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult? Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult? Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult? Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + }) { + return browseSection?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(SpotubePaginationResponseObjectItem_Track value)? track, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistFull value)? + playlistFull, + TResult Function(SpotubePaginationResponseObjectItem_PlaylistSimple value)? + playlistSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumSimple value)? + albumSimple, + TResult Function(SpotubePaginationResponseObjectItem_AlbumFull value)? + albumFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistFull value)? + artistFull, + TResult Function(SpotubePaginationResponseObjectItem_ArtistSimple value)? + artistSimple, + TResult Function(SpotubePaginationResponseObjectItem_BrowseSection value)? + browseSection, + required TResult orElse(), + }) { + if (browseSection != null) { + return browseSection(this); + } + return orElse(); + } +} + +abstract class SpotubePaginationResponseObjectItem_BrowseSection + extends SpotubePaginationResponseObjectItem { + const factory SpotubePaginationResponseObjectItem_BrowseSection( + final SpotubeBrowseSectionObject field0) = + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl; + const SpotubePaginationResponseObjectItem_BrowseSection._() : super._(); + + @override + SpotubeBrowseSectionObject get field0; + + /// Create a copy of SpotubePaginationResponseObjectItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubePaginationResponseObjectItem_BrowseSectionImplCopyWith< + _$SpotubePaginationResponseObjectItem_BrowseSectionImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/playlist.dart b/lib/src/rust/api/plugin/models/playlist.dart new file mode 100644 index 00000000..1714937b --- /dev/null +++ b/lib/src/rust/api/plugin/models/playlist.dart @@ -0,0 +1,49 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +import 'user.dart'; +part 'playlist.freezed.dart'; +part 'playlist.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `fmt`, `fmt` + +@freezed +sealed class SpotubeFullPlaylistObject with _$SpotubeFullPlaylistObject { + const factory SpotubeFullPlaylistObject({ + required String typeName, + required String id, + required String name, + required String description, + required String externalUri, + required SpotubeUserObject owner, + required List images, + required List collaborators, + required bool collaborative, + required bool public, + }) = _SpotubeFullPlaylistObject; + + factory SpotubeFullPlaylistObject.fromJson(Map json) => + _$SpotubeFullPlaylistObjectFromJson(json); +} + +@freezed +sealed class SpotubeSimplePlaylistObject with _$SpotubeSimplePlaylistObject { + const factory SpotubeSimplePlaylistObject({ + required String typeName, + required String id, + required String name, + required String description, + required String externalUri, + required SpotubeUserObject owner, + required List images, + }) = _SpotubeSimplePlaylistObject; + + factory SpotubeSimplePlaylistObject.fromJson(Map json) => + _$SpotubeSimplePlaylistObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/playlist.freezed.dart b/lib/src/rust/api/plugin/models/playlist.freezed.dart new file mode 100644 index 00000000..5f03d8a7 --- /dev/null +++ b/lib/src/rust/api/plugin/models/playlist.freezed.dart @@ -0,0 +1,710 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'playlist.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeFullPlaylistObject _$SpotubeFullPlaylistObjectFromJson( + Map json) { + return _SpotubeFullPlaylistObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeFullPlaylistObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get description => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + SpotubeUserObject get owner => throw _privateConstructorUsedError; + List get images => throw _privateConstructorUsedError; + List get collaborators => + throw _privateConstructorUsedError; + bool get collaborative => throw _privateConstructorUsedError; + bool get public => throw _privateConstructorUsedError; + + /// Serializes this SpotubeFullPlaylistObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeFullPlaylistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeFullPlaylistObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeFullPlaylistObjectCopyWith<$Res> { + factory $SpotubeFullPlaylistObjectCopyWith(SpotubeFullPlaylistObject value, + $Res Function(SpotubeFullPlaylistObject) then) = + _$SpotubeFullPlaylistObjectCopyWithImpl<$Res, SpotubeFullPlaylistObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String description, + String externalUri, + SpotubeUserObject owner, + List images, + List collaborators, + bool collaborative, + bool public}); + + $SpotubeUserObjectCopyWith<$Res> get owner; +} + +/// @nodoc +class _$SpotubeFullPlaylistObjectCopyWithImpl<$Res, + $Val extends SpotubeFullPlaylistObject> + implements $SpotubeFullPlaylistObjectCopyWith<$Res> { + _$SpotubeFullPlaylistObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeFullPlaylistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? description = null, + Object? externalUri = null, + Object? owner = null, + Object? images = null, + Object? collaborators = null, + Object? collaborative = null, + Object? public = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + owner: null == owner + ? _value.owner + : owner // ignore: cast_nullable_to_non_nullable + as SpotubeUserObject, + images: null == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List, + collaborators: null == collaborators + ? _value.collaborators + : collaborators // ignore: cast_nullable_to_non_nullable + as List, + collaborative: null == collaborative + ? _value.collaborative + : collaborative // ignore: cast_nullable_to_non_nullable + as bool, + public: null == public + ? _value.public + : public // ignore: cast_nullable_to_non_nullable + as bool, + ) as $Val); + } + + /// Create a copy of SpotubeFullPlaylistObject + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeUserObjectCopyWith<$Res> get owner { + return $SpotubeUserObjectCopyWith<$Res>(_value.owner, (value) { + return _then(_value.copyWith(owner: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$SpotubeFullPlaylistObjectImplCopyWith<$Res> + implements $SpotubeFullPlaylistObjectCopyWith<$Res> { + factory _$$SpotubeFullPlaylistObjectImplCopyWith( + _$SpotubeFullPlaylistObjectImpl value, + $Res Function(_$SpotubeFullPlaylistObjectImpl) then) = + __$$SpotubeFullPlaylistObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String description, + String externalUri, + SpotubeUserObject owner, + List images, + List collaborators, + bool collaborative, + bool public}); + + @override + $SpotubeUserObjectCopyWith<$Res> get owner; +} + +/// @nodoc +class __$$SpotubeFullPlaylistObjectImplCopyWithImpl<$Res> + extends _$SpotubeFullPlaylistObjectCopyWithImpl<$Res, + _$SpotubeFullPlaylistObjectImpl> + implements _$$SpotubeFullPlaylistObjectImplCopyWith<$Res> { + __$$SpotubeFullPlaylistObjectImplCopyWithImpl( + _$SpotubeFullPlaylistObjectImpl _value, + $Res Function(_$SpotubeFullPlaylistObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeFullPlaylistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? description = null, + Object? externalUri = null, + Object? owner = null, + Object? images = null, + Object? collaborators = null, + Object? collaborative = null, + Object? public = null, + }) { + return _then(_$SpotubeFullPlaylistObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + owner: null == owner + ? _value.owner + : owner // ignore: cast_nullable_to_non_nullable + as SpotubeUserObject, + images: null == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List, + collaborators: null == collaborators + ? _value._collaborators + : collaborators // ignore: cast_nullable_to_non_nullable + as List, + collaborative: null == collaborative + ? _value.collaborative + : collaborative // ignore: cast_nullable_to_non_nullable + as bool, + public: null == public + ? _value.public + : public // ignore: cast_nullable_to_non_nullable + as bool, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeFullPlaylistObjectImpl implements _SpotubeFullPlaylistObject { + const _$SpotubeFullPlaylistObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.description, + required this.externalUri, + required this.owner, + required final List images, + required final List collaborators, + required this.collaborative, + required this.public}) + : _images = images, + _collaborators = collaborators; + + factory _$SpotubeFullPlaylistObjectImpl.fromJson(Map json) => + _$$SpotubeFullPlaylistObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String description; + @override + final String externalUri; + @override + final SpotubeUserObject owner; + final List _images; + @override + List get images { + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_images); + } + + final List _collaborators; + @override + List get collaborators { + if (_collaborators is EqualUnmodifiableListView) return _collaborators; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_collaborators); + } + + @override + final bool collaborative; + @override + final bool public; + + @override + String toString() { + return 'SpotubeFullPlaylistObject(typeName: $typeName, id: $id, name: $name, description: $description, externalUri: $externalUri, owner: $owner, images: $images, collaborators: $collaborators, collaborative: $collaborative, public: $public)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeFullPlaylistObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + (identical(other.owner, owner) || other.owner == owner) && + const DeepCollectionEquality().equals(other._images, _images) && + const DeepCollectionEquality() + .equals(other._collaborators, _collaborators) && + (identical(other.collaborative, collaborative) || + other.collaborative == collaborative) && + (identical(other.public, public) || other.public == public)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + id, + name, + description, + externalUri, + owner, + const DeepCollectionEquality().hash(_images), + const DeepCollectionEquality().hash(_collaborators), + collaborative, + public); + + /// Create a copy of SpotubeFullPlaylistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeFullPlaylistObjectImplCopyWith<_$SpotubeFullPlaylistObjectImpl> + get copyWith => __$$SpotubeFullPlaylistObjectImplCopyWithImpl< + _$SpotubeFullPlaylistObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeFullPlaylistObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeFullPlaylistObject implements SpotubeFullPlaylistObject { + const factory _SpotubeFullPlaylistObject( + {required final String typeName, + required final String id, + required final String name, + required final String description, + required final String externalUri, + required final SpotubeUserObject owner, + required final List images, + required final List collaborators, + required final bool collaborative, + required final bool public}) = _$SpotubeFullPlaylistObjectImpl; + + factory _SpotubeFullPlaylistObject.fromJson(Map json) = + _$SpotubeFullPlaylistObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get description; + @override + String get externalUri; + @override + SpotubeUserObject get owner; + @override + List get images; + @override + List get collaborators; + @override + bool get collaborative; + @override + bool get public; + + /// Create a copy of SpotubeFullPlaylistObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeFullPlaylistObjectImplCopyWith<_$SpotubeFullPlaylistObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} + +SpotubeSimplePlaylistObject _$SpotubeSimplePlaylistObjectFromJson( + Map json) { + return _SpotubeSimplePlaylistObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeSimplePlaylistObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get description => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + SpotubeUserObject get owner => throw _privateConstructorUsedError; + List get images => throw _privateConstructorUsedError; + + /// Serializes this SpotubeSimplePlaylistObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeSimplePlaylistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeSimplePlaylistObjectCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeSimplePlaylistObjectCopyWith<$Res> { + factory $SpotubeSimplePlaylistObjectCopyWith( + SpotubeSimplePlaylistObject value, + $Res Function(SpotubeSimplePlaylistObject) then) = + _$SpotubeSimplePlaylistObjectCopyWithImpl<$Res, + SpotubeSimplePlaylistObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String description, + String externalUri, + SpotubeUserObject owner, + List images}); + + $SpotubeUserObjectCopyWith<$Res> get owner; +} + +/// @nodoc +class _$SpotubeSimplePlaylistObjectCopyWithImpl<$Res, + $Val extends SpotubeSimplePlaylistObject> + implements $SpotubeSimplePlaylistObjectCopyWith<$Res> { + _$SpotubeSimplePlaylistObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeSimplePlaylistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? description = null, + Object? externalUri = null, + Object? owner = null, + Object? images = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + owner: null == owner + ? _value.owner + : owner // ignore: cast_nullable_to_non_nullable + as SpotubeUserObject, + images: null == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } + + /// Create a copy of SpotubeSimplePlaylistObject + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeUserObjectCopyWith<$Res> get owner { + return $SpotubeUserObjectCopyWith<$Res>(_value.owner, (value) { + return _then(_value.copyWith(owner: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$SpotubeSimplePlaylistObjectImplCopyWith<$Res> + implements $SpotubeSimplePlaylistObjectCopyWith<$Res> { + factory _$$SpotubeSimplePlaylistObjectImplCopyWith( + _$SpotubeSimplePlaylistObjectImpl value, + $Res Function(_$SpotubeSimplePlaylistObjectImpl) then) = + __$$SpotubeSimplePlaylistObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String description, + String externalUri, + SpotubeUserObject owner, + List images}); + + @override + $SpotubeUserObjectCopyWith<$Res> get owner; +} + +/// @nodoc +class __$$SpotubeSimplePlaylistObjectImplCopyWithImpl<$Res> + extends _$SpotubeSimplePlaylistObjectCopyWithImpl<$Res, + _$SpotubeSimplePlaylistObjectImpl> + implements _$$SpotubeSimplePlaylistObjectImplCopyWith<$Res> { + __$$SpotubeSimplePlaylistObjectImplCopyWithImpl( + _$SpotubeSimplePlaylistObjectImpl _value, + $Res Function(_$SpotubeSimplePlaylistObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeSimplePlaylistObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? description = null, + Object? externalUri = null, + Object? owner = null, + Object? images = null, + }) { + return _then(_$SpotubeSimplePlaylistObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + owner: null == owner + ? _value.owner + : owner // ignore: cast_nullable_to_non_nullable + as SpotubeUserObject, + images: null == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeSimplePlaylistObjectImpl + implements _SpotubeSimplePlaylistObject { + const _$SpotubeSimplePlaylistObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.description, + required this.externalUri, + required this.owner, + required final List images}) + : _images = images; + + factory _$SpotubeSimplePlaylistObjectImpl.fromJson( + Map json) => + _$$SpotubeSimplePlaylistObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String description; + @override + final String externalUri; + @override + final SpotubeUserObject owner; + final List _images; + @override + List get images { + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_images); + } + + @override + String toString() { + return 'SpotubeSimplePlaylistObject(typeName: $typeName, id: $id, name: $name, description: $description, externalUri: $externalUri, owner: $owner, images: $images)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeSimplePlaylistObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.description, description) || + other.description == description) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + (identical(other.owner, owner) || other.owner == owner) && + const DeepCollectionEquality().equals(other._images, _images)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, typeName, id, name, description, + externalUri, owner, const DeepCollectionEquality().hash(_images)); + + /// Create a copy of SpotubeSimplePlaylistObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeSimplePlaylistObjectImplCopyWith<_$SpotubeSimplePlaylistObjectImpl> + get copyWith => __$$SpotubeSimplePlaylistObjectImplCopyWithImpl< + _$SpotubeSimplePlaylistObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeSimplePlaylistObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeSimplePlaylistObject + implements SpotubeSimplePlaylistObject { + const factory _SpotubeSimplePlaylistObject( + {required final String typeName, + required final String id, + required final String name, + required final String description, + required final String externalUri, + required final SpotubeUserObject owner, + required final List images}) = + _$SpotubeSimplePlaylistObjectImpl; + + factory _SpotubeSimplePlaylistObject.fromJson(Map json) = + _$SpotubeSimplePlaylistObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get description; + @override + String get externalUri; + @override + SpotubeUserObject get owner; + @override + List get images; + + /// Create a copy of SpotubeSimplePlaylistObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeSimplePlaylistObjectImplCopyWith<_$SpotubeSimplePlaylistObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/playlist.g.dart b/lib/src/rust/api/plugin/models/playlist.g.dart new file mode 100644 index 00000000..05bc9bb5 --- /dev/null +++ b/lib/src/rust/api/plugin/models/playlist.g.dart @@ -0,0 +1,72 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'playlist.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeFullPlaylistObjectImpl _$$SpotubeFullPlaylistObjectImplFromJson( + Map json) => + _$SpotubeFullPlaylistObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + description: json['description'] as String, + externalUri: json['externalUri'] as String, + owner: SpotubeUserObject.fromJson( + Map.from(json['owner'] as Map)), + images: (json['images'] as List) + .map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + collaborators: (json['collaborators'] as List) + .map((e) => + SpotubeUserObject.fromJson(Map.from(e as Map))) + .toList(), + collaborative: json['collaborative'] as bool, + public: json['public'] as bool, + ); + +Map _$$SpotubeFullPlaylistObjectImplToJson( + _$SpotubeFullPlaylistObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'description': instance.description, + 'externalUri': instance.externalUri, + 'owner': instance.owner.toJson(), + 'images': instance.images.map((e) => e.toJson()).toList(), + 'collaborators': instance.collaborators.map((e) => e.toJson()).toList(), + 'collaborative': instance.collaborative, + 'public': instance.public, + }; + +_$SpotubeSimplePlaylistObjectImpl _$$SpotubeSimplePlaylistObjectImplFromJson( + Map json) => + _$SpotubeSimplePlaylistObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + description: json['description'] as String, + externalUri: json['externalUri'] as String, + owner: SpotubeUserObject.fromJson( + Map.from(json['owner'] as Map)), + images: (json['images'] as List) + .map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + ); + +Map _$$SpotubeSimplePlaylistObjectImplToJson( + _$SpotubeSimplePlaylistObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'description': instance.description, + 'externalUri': instance.externalUri, + 'owner': instance.owner.toJson(), + 'images': instance.images.map((e) => e.toJson()).toList(), + }; diff --git a/lib/src/rust/api/plugin/models/search.dart b/lib/src/rust/api/plugin/models/search.dart new file mode 100644 index 00000000..626ad048 --- /dev/null +++ b/lib/src/rust/api/plugin/models/search.dart @@ -0,0 +1,32 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'album.dart'; +import 'artist.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +import 'playlist.dart'; +import 'track.dart'; +import 'user.dart'; +part 'search.freezed.dart'; +part 'search.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt` + +@freezed +sealed class SpotubeSearchResponseObject with _$SpotubeSearchResponseObject { + const factory SpotubeSearchResponseObject({ + required String typeName, + required List albums, + required List artists, + required List playlists, + required List tracks, + }) = _SpotubeSearchResponseObject; + + factory SpotubeSearchResponseObject.fromJson(Map json) => + _$SpotubeSearchResponseObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/search.freezed.dart b/lib/src/rust/api/plugin/models/search.freezed.dart new file mode 100644 index 00000000..fd7448c3 --- /dev/null +++ b/lib/src/rust/api/plugin/models/search.freezed.dart @@ -0,0 +1,298 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'search.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeSearchResponseObject _$SpotubeSearchResponseObjectFromJson( + Map json) { + return _SpotubeSearchResponseObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeSearchResponseObject { + String get typeName => throw _privateConstructorUsedError; + List get albums => + throw _privateConstructorUsedError; + List get artists => + throw _privateConstructorUsedError; + List get playlists => + throw _privateConstructorUsedError; + List get tracks => throw _privateConstructorUsedError; + + /// Serializes this SpotubeSearchResponseObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeSearchResponseObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeSearchResponseObjectCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeSearchResponseObjectCopyWith<$Res> { + factory $SpotubeSearchResponseObjectCopyWith( + SpotubeSearchResponseObject value, + $Res Function(SpotubeSearchResponseObject) then) = + _$SpotubeSearchResponseObjectCopyWithImpl<$Res, + SpotubeSearchResponseObject>; + @useResult + $Res call( + {String typeName, + List albums, + List artists, + List playlists, + List tracks}); +} + +/// @nodoc +class _$SpotubeSearchResponseObjectCopyWithImpl<$Res, + $Val extends SpotubeSearchResponseObject> + implements $SpotubeSearchResponseObjectCopyWith<$Res> { + _$SpotubeSearchResponseObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeSearchResponseObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? albums = null, + Object? artists = null, + Object? playlists = null, + Object? tracks = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + albums: null == albums + ? _value.albums + : albums // ignore: cast_nullable_to_non_nullable + as List, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + playlists: null == playlists + ? _value.playlists + : playlists // ignore: cast_nullable_to_non_nullable + as List, + tracks: null == tracks + ? _value.tracks + : tracks // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeSearchResponseObjectImplCopyWith<$Res> + implements $SpotubeSearchResponseObjectCopyWith<$Res> { + factory _$$SpotubeSearchResponseObjectImplCopyWith( + _$SpotubeSearchResponseObjectImpl value, + $Res Function(_$SpotubeSearchResponseObjectImpl) then) = + __$$SpotubeSearchResponseObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + List albums, + List artists, + List playlists, + List tracks}); +} + +/// @nodoc +class __$$SpotubeSearchResponseObjectImplCopyWithImpl<$Res> + extends _$SpotubeSearchResponseObjectCopyWithImpl<$Res, + _$SpotubeSearchResponseObjectImpl> + implements _$$SpotubeSearchResponseObjectImplCopyWith<$Res> { + __$$SpotubeSearchResponseObjectImplCopyWithImpl( + _$SpotubeSearchResponseObjectImpl _value, + $Res Function(_$SpotubeSearchResponseObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeSearchResponseObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? albums = null, + Object? artists = null, + Object? playlists = null, + Object? tracks = null, + }) { + return _then(_$SpotubeSearchResponseObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + albums: null == albums + ? _value._albums + : albums // ignore: cast_nullable_to_non_nullable + as List, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + playlists: null == playlists + ? _value._playlists + : playlists // ignore: cast_nullable_to_non_nullable + as List, + tracks: null == tracks + ? _value._tracks + : tracks // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeSearchResponseObjectImpl + implements _SpotubeSearchResponseObject { + const _$SpotubeSearchResponseObjectImpl( + {required this.typeName, + required final List albums, + required final List artists, + required final List playlists, + required final List tracks}) + : _albums = albums, + _artists = artists, + _playlists = playlists, + _tracks = tracks; + + factory _$SpotubeSearchResponseObjectImpl.fromJson( + Map json) => + _$$SpotubeSearchResponseObjectImplFromJson(json); + + @override + final String typeName; + final List _albums; + @override + List get albums { + if (_albums is EqualUnmodifiableListView) return _albums; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_albums); + } + + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + final List _playlists; + @override + List get playlists { + if (_playlists is EqualUnmodifiableListView) return _playlists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_playlists); + } + + final List _tracks; + @override + List get tracks { + if (_tracks is EqualUnmodifiableListView) return _tracks; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_tracks); + } + + @override + String toString() { + return 'SpotubeSearchResponseObject(typeName: $typeName, albums: $albums, artists: $artists, playlists: $playlists, tracks: $tracks)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeSearchResponseObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + const DeepCollectionEquality().equals(other._albums, _albums) && + const DeepCollectionEquality().equals(other._artists, _artists) && + const DeepCollectionEquality() + .equals(other._playlists, _playlists) && + const DeepCollectionEquality().equals(other._tracks, _tracks)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + const DeepCollectionEquality().hash(_albums), + const DeepCollectionEquality().hash(_artists), + const DeepCollectionEquality().hash(_playlists), + const DeepCollectionEquality().hash(_tracks)); + + /// Create a copy of SpotubeSearchResponseObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeSearchResponseObjectImplCopyWith<_$SpotubeSearchResponseObjectImpl> + get copyWith => __$$SpotubeSearchResponseObjectImplCopyWithImpl< + _$SpotubeSearchResponseObjectImpl>(this, _$identity); + + @override + Map toJson() { + return _$$SpotubeSearchResponseObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeSearchResponseObject + implements SpotubeSearchResponseObject { + const factory _SpotubeSearchResponseObject( + {required final String typeName, + required final List albums, + required final List artists, + required final List playlists, + required final List tracks}) = + _$SpotubeSearchResponseObjectImpl; + + factory _SpotubeSearchResponseObject.fromJson(Map json) = + _$SpotubeSearchResponseObjectImpl.fromJson; + + @override + String get typeName; + @override + List get albums; + @override + List get artists; + @override + List get playlists; + @override + List get tracks; + + /// Create a copy of SpotubeSearchResponseObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeSearchResponseObjectImplCopyWith<_$SpotubeSearchResponseObjectImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/search.g.dart b/lib/src/rust/api/plugin/models/search.g.dart new file mode 100644 index 00000000..d49cbdf5 --- /dev/null +++ b/lib/src/rust/api/plugin/models/search.g.dart @@ -0,0 +1,39 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'search.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeSearchResponseObjectImpl _$$SpotubeSearchResponseObjectImplFromJson( + Map json) => + _$SpotubeSearchResponseObjectImpl( + typeName: json['typeName'] as String, + albums: (json['albums'] as List) + .map((e) => SpotubeSimpleAlbumObject.fromJson( + Map.from(e as Map))) + .toList(), + artists: (json['artists'] as List) + .map((e) => SpotubeFullArtistObject.fromJson( + Map.from(e as Map))) + .toList(), + playlists: (json['playlists'] as List) + .map((e) => SpotubeSimplePlaylistObject.fromJson( + Map.from(e as Map))) + .toList(), + tracks: (json['tracks'] as List) + .map((e) => + SpotubeTrackObject.fromJson(Map.from(e as Map))) + .toList(), + ); + +Map _$$SpotubeSearchResponseObjectImplToJson( + _$SpotubeSearchResponseObjectImpl instance) => + { + 'typeName': instance.typeName, + 'albums': instance.albums.map((e) => e.toJson()).toList(), + 'artists': instance.artists.map((e) => e.toJson()).toList(), + 'playlists': instance.playlists.map((e) => e.toJson()).toList(), + 'tracks': instance.tracks.map((e) => e.toJson()).toList(), + }; diff --git a/lib/src/rust/api/plugin/models/track.dart b/lib/src/rust/api/plugin/models/track.dart new file mode 100644 index 00000000..4fdb6c2f --- /dev/null +++ b/lib/src/rust/api/plugin/models/track.dart @@ -0,0 +1,33 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'album.dart'; +import 'artist.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'track.freezed.dart'; +part 'track.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt` + +@freezed +sealed class SpotubeTrackObject with _$SpotubeTrackObject { + const factory SpotubeTrackObject({ + required String typeName, + required String id, + required String name, + required String externalUri, + required List artists, + required SpotubeSimpleAlbumObject album, + required BigInt durationMs, + required String isrc, + required bool explicit, + }) = _SpotubeTrackObject; + + factory SpotubeTrackObject.fromJson(Map json) => + _$SpotubeTrackObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/track.freezed.dart b/lib/src/rust/api/plugin/models/track.freezed.dart new file mode 100644 index 00000000..31e62011 --- /dev/null +++ b/lib/src/rust/api/plugin/models/track.freezed.dart @@ -0,0 +1,366 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'track.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeTrackObject _$SpotubeTrackObjectFromJson(Map json) { + return _SpotubeTrackObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeTrackObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + List get artists => + throw _privateConstructorUsedError; + SpotubeSimpleAlbumObject get album => throw _privateConstructorUsedError; + BigInt get durationMs => throw _privateConstructorUsedError; + String get isrc => throw _privateConstructorUsedError; + bool get explicit => throw _privateConstructorUsedError; + + /// Serializes this SpotubeTrackObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeTrackObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeTrackObjectCopyWith<$Res> { + factory $SpotubeTrackObjectCopyWith( + SpotubeTrackObject value, $Res Function(SpotubeTrackObject) then) = + _$SpotubeTrackObjectCopyWithImpl<$Res, SpotubeTrackObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List artists, + SpotubeSimpleAlbumObject album, + BigInt durationMs, + String isrc, + bool explicit}); + + $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; +} + +/// @nodoc +class _$SpotubeTrackObjectCopyWithImpl<$Res, $Val extends SpotubeTrackObject> + implements $SpotubeTrackObjectCopyWith<$Res> { + _$SpotubeTrackObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? artists = null, + Object? album = null, + Object? durationMs = null, + Object? isrc = null, + Object? explicit = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value.artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + album: null == album + ? _value.album + : album // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleAlbumObject, + durationMs: null == durationMs + ? _value.durationMs + : durationMs // ignore: cast_nullable_to_non_nullable + as BigInt, + isrc: null == isrc + ? _value.isrc + : isrc // ignore: cast_nullable_to_non_nullable + as String, + explicit: null == explicit + ? _value.explicit + : explicit // ignore: cast_nullable_to_non_nullable + as bool, + ) as $Val); + } + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $SpotubeSimpleAlbumObjectCopyWith<$Res> get album { + return $SpotubeSimpleAlbumObjectCopyWith<$Res>(_value.album, (value) { + return _then(_value.copyWith(album: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$SpotubeTrackObjectImplCopyWith<$Res> + implements $SpotubeTrackObjectCopyWith<$Res> { + factory _$$SpotubeTrackObjectImplCopyWith(_$SpotubeTrackObjectImpl value, + $Res Function(_$SpotubeTrackObjectImpl) then) = + __$$SpotubeTrackObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + String externalUri, + List artists, + SpotubeSimpleAlbumObject album, + BigInt durationMs, + String isrc, + bool explicit}); + + @override + $SpotubeSimpleAlbumObjectCopyWith<$Res> get album; +} + +/// @nodoc +class __$$SpotubeTrackObjectImplCopyWithImpl<$Res> + extends _$SpotubeTrackObjectCopyWithImpl<$Res, _$SpotubeTrackObjectImpl> + implements _$$SpotubeTrackObjectImplCopyWith<$Res> { + __$$SpotubeTrackObjectImplCopyWithImpl(_$SpotubeTrackObjectImpl _value, + $Res Function(_$SpotubeTrackObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? externalUri = null, + Object? artists = null, + Object? album = null, + Object? durationMs = null, + Object? isrc = null, + Object? explicit = null, + }) { + return _then(_$SpotubeTrackObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + artists: null == artists + ? _value._artists + : artists // ignore: cast_nullable_to_non_nullable + as List, + album: null == album + ? _value.album + : album // ignore: cast_nullable_to_non_nullable + as SpotubeSimpleAlbumObject, + durationMs: null == durationMs + ? _value.durationMs + : durationMs // ignore: cast_nullable_to_non_nullable + as BigInt, + isrc: null == isrc + ? _value.isrc + : isrc // ignore: cast_nullable_to_non_nullable + as String, + explicit: null == explicit + ? _value.explicit + : explicit // ignore: cast_nullable_to_non_nullable + as bool, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeTrackObjectImpl implements _SpotubeTrackObject { + const _$SpotubeTrackObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required this.externalUri, + required final List artists, + required this.album, + required this.durationMs, + required this.isrc, + required this.explicit}) + : _artists = artists; + + factory _$SpotubeTrackObjectImpl.fromJson(Map json) => + _$$SpotubeTrackObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + @override + final String externalUri; + final List _artists; + @override + List get artists { + if (_artists is EqualUnmodifiableListView) return _artists; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_artists); + } + + @override + final SpotubeSimpleAlbumObject album; + @override + final BigInt durationMs; + @override + final String isrc; + @override + final bool explicit; + + @override + String toString() { + return 'SpotubeTrackObject(typeName: $typeName, id: $id, name: $name, externalUri: $externalUri, artists: $artists, album: $album, durationMs: $durationMs, isrc: $isrc, explicit: $explicit)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeTrackObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri) && + const DeepCollectionEquality().equals(other._artists, _artists) && + (identical(other.album, album) || other.album == album) && + (identical(other.durationMs, durationMs) || + other.durationMs == durationMs) && + (identical(other.isrc, isrc) || other.isrc == isrc) && + (identical(other.explicit, explicit) || + other.explicit == explicit)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + typeName, + id, + name, + externalUri, + const DeepCollectionEquality().hash(_artists), + album, + durationMs, + isrc, + explicit); + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeTrackObjectImplCopyWith<_$SpotubeTrackObjectImpl> get copyWith => + __$$SpotubeTrackObjectImplCopyWithImpl<_$SpotubeTrackObjectImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$SpotubeTrackObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeTrackObject implements SpotubeTrackObject { + const factory _SpotubeTrackObject( + {required final String typeName, + required final String id, + required final String name, + required final String externalUri, + required final List artists, + required final SpotubeSimpleAlbumObject album, + required final BigInt durationMs, + required final String isrc, + required final bool explicit}) = _$SpotubeTrackObjectImpl; + + factory _SpotubeTrackObject.fromJson(Map json) = + _$SpotubeTrackObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + String get externalUri; + @override + List get artists; + @override + SpotubeSimpleAlbumObject get album; + @override + BigInt get durationMs; + @override + String get isrc; + @override + bool get explicit; + + /// Create a copy of SpotubeTrackObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeTrackObjectImplCopyWith<_$SpotubeTrackObjectImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/track.g.dart b/lib/src/rust/api/plugin/models/track.g.dart new file mode 100644 index 00000000..ac888e4f --- /dev/null +++ b/lib/src/rust/api/plugin/models/track.g.dart @@ -0,0 +1,38 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'track.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeTrackObjectImpl _$$SpotubeTrackObjectImplFromJson(Map json) => + _$SpotubeTrackObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + externalUri: json['externalUri'] as String, + artists: (json['artists'] as List) + .map((e) => SpotubeSimpleArtistObject.fromJson( + Map.from(e as Map))) + .toList(), + album: SpotubeSimpleAlbumObject.fromJson( + Map.from(json['album'] as Map)), + durationMs: BigInt.parse(json['durationMs'] as String), + isrc: json['isrc'] as String, + explicit: json['explicit'] as bool, + ); + +Map _$$SpotubeTrackObjectImplToJson( + _$SpotubeTrackObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'externalUri': instance.externalUri, + 'artists': instance.artists.map((e) => e.toJson()).toList(), + 'album': instance.album.toJson(), + 'durationMs': instance.durationMs.toString(), + 'isrc': instance.isrc, + 'explicit': instance.explicit, + }; diff --git a/lib/src/rust/api/plugin/models/user.dart b/lib/src/rust/api/plugin/models/user.dart new file mode 100644 index 00000000..f7d5bab8 --- /dev/null +++ b/lib/src/rust/api/plugin/models/user.dart @@ -0,0 +1,27 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../../frb_generated.dart'; +import 'image.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'package:freezed_annotation/freezed_annotation.dart' hide protected; +part 'user.freezed.dart'; +part 'user.g.dart'; + +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt` + +@freezed +sealed class SpotubeUserObject with _$SpotubeUserObject { + const factory SpotubeUserObject({ + required String typeName, + required String id, + required String name, + required List images, + required String externalUri, + }) = _SpotubeUserObject; + + factory SpotubeUserObject.fromJson(Map json) => + _$SpotubeUserObjectFromJson(json); +} diff --git a/lib/src/rust/api/plugin/models/user.freezed.dart b/lib/src/rust/api/plugin/models/user.freezed.dart new file mode 100644 index 00000000..e407ae15 --- /dev/null +++ b/lib/src/rust/api/plugin/models/user.freezed.dart @@ -0,0 +1,259 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'user.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +SpotubeUserObject _$SpotubeUserObjectFromJson(Map json) { + return _SpotubeUserObject.fromJson(json); +} + +/// @nodoc +mixin _$SpotubeUserObject { + String get typeName => throw _privateConstructorUsedError; + String get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + List get images => throw _privateConstructorUsedError; + String get externalUri => throw _privateConstructorUsedError; + + /// Serializes this SpotubeUserObject to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of SpotubeUserObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $SpotubeUserObjectCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $SpotubeUserObjectCopyWith<$Res> { + factory $SpotubeUserObjectCopyWith( + SpotubeUserObject value, $Res Function(SpotubeUserObject) then) = + _$SpotubeUserObjectCopyWithImpl<$Res, SpotubeUserObject>; + @useResult + $Res call( + {String typeName, + String id, + String name, + List images, + String externalUri}); +} + +/// @nodoc +class _$SpotubeUserObjectCopyWithImpl<$Res, $Val extends SpotubeUserObject> + implements $SpotubeUserObjectCopyWith<$Res> { + _$SpotubeUserObjectCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of SpotubeUserObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? images = null, + Object? externalUri = null, + }) { + return _then(_value.copyWith( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + images: null == images + ? _value.images + : images // ignore: cast_nullable_to_non_nullable + as List, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$SpotubeUserObjectImplCopyWith<$Res> + implements $SpotubeUserObjectCopyWith<$Res> { + factory _$$SpotubeUserObjectImplCopyWith(_$SpotubeUserObjectImpl value, + $Res Function(_$SpotubeUserObjectImpl) then) = + __$$SpotubeUserObjectImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String typeName, + String id, + String name, + List images, + String externalUri}); +} + +/// @nodoc +class __$$SpotubeUserObjectImplCopyWithImpl<$Res> + extends _$SpotubeUserObjectCopyWithImpl<$Res, _$SpotubeUserObjectImpl> + implements _$$SpotubeUserObjectImplCopyWith<$Res> { + __$$SpotubeUserObjectImplCopyWithImpl(_$SpotubeUserObjectImpl _value, + $Res Function(_$SpotubeUserObjectImpl) _then) + : super(_value, _then); + + /// Create a copy of SpotubeUserObject + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? typeName = null, + Object? id = null, + Object? name = null, + Object? images = null, + Object? externalUri = null, + }) { + return _then(_$SpotubeUserObjectImpl( + typeName: null == typeName + ? _value.typeName + : typeName // ignore: cast_nullable_to_non_nullable + as String, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as String, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + images: null == images + ? _value._images + : images // ignore: cast_nullable_to_non_nullable + as List, + externalUri: null == externalUri + ? _value.externalUri + : externalUri // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$SpotubeUserObjectImpl implements _SpotubeUserObject { + const _$SpotubeUserObjectImpl( + {required this.typeName, + required this.id, + required this.name, + required final List images, + required this.externalUri}) + : _images = images; + + factory _$SpotubeUserObjectImpl.fromJson(Map json) => + _$$SpotubeUserObjectImplFromJson(json); + + @override + final String typeName; + @override + final String id; + @override + final String name; + final List _images; + @override + List get images { + if (_images is EqualUnmodifiableListView) return _images; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_images); + } + + @override + final String externalUri; + + @override + String toString() { + return 'SpotubeUserObject(typeName: $typeName, id: $id, name: $name, images: $images, externalUri: $externalUri)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SpotubeUserObjectImpl && + (identical(other.typeName, typeName) || + other.typeName == typeName) && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name) && + const DeepCollectionEquality().equals(other._images, _images) && + (identical(other.externalUri, externalUri) || + other.externalUri == externalUri)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash(runtimeType, typeName, id, name, + const DeepCollectionEquality().hash(_images), externalUri); + + /// Create a copy of SpotubeUserObject + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SpotubeUserObjectImplCopyWith<_$SpotubeUserObjectImpl> get copyWith => + __$$SpotubeUserObjectImplCopyWithImpl<_$SpotubeUserObjectImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$SpotubeUserObjectImplToJson( + this, + ); + } +} + +abstract class _SpotubeUserObject implements SpotubeUserObject { + const factory _SpotubeUserObject( + {required final String typeName, + required final String id, + required final String name, + required final List images, + required final String externalUri}) = _$SpotubeUserObjectImpl; + + factory _SpotubeUserObject.fromJson(Map json) = + _$SpotubeUserObjectImpl.fromJson; + + @override + String get typeName; + @override + String get id; + @override + String get name; + @override + List get images; + @override + String get externalUri; + + /// Create a copy of SpotubeUserObject + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SpotubeUserObjectImplCopyWith<_$SpotubeUserObjectImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/rust/api/plugin/models/user.g.dart b/lib/src/rust/api/plugin/models/user.g.dart new file mode 100644 index 00000000..bea0798b --- /dev/null +++ b/lib/src/rust/api/plugin/models/user.g.dart @@ -0,0 +1,29 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$SpotubeUserObjectImpl _$$SpotubeUserObjectImplFromJson(Map json) => + _$SpotubeUserObjectImpl( + typeName: json['typeName'] as String, + id: json['id'] as String, + name: json['name'] as String, + images: (json['images'] as List) + .map((e) => + SpotubeImageObject.fromJson(Map.from(e as Map))) + .toList(), + externalUri: json['externalUri'] as String, + ); + +Map _$$SpotubeUserObjectImplToJson( + _$SpotubeUserObjectImpl instance) => + { + 'typeName': instance.typeName, + 'id': instance.id, + 'name': instance.name, + 'images': instance.images.map((e) => e.toJson()).toList(), + 'externalUri': instance.externalUri, + }; diff --git a/lib/src/rust/api/plugin/plugin.dart b/lib/src/rust/api/plugin/plugin.dart new file mode 100644 index 00000000..62d3029f --- /dev/null +++ b/lib/src/rust/api/plugin/plugin.dart @@ -0,0 +1,90 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../frb_generated.dart'; +import 'models/core.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'senders.dart'; + +// These functions are ignored because they are not marked as `pub`: `js_executor_thread` +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `fmt` +// These functions are ignored (category: IgnoreBecauseExplicitAttribute): `create_context` + +// Rust type: RustOpaqueMoi> +abstract class OpaqueSender implements RustOpaqueInterface { + SenderPluginCommand get sender; + + set sender(SenderPluginCommand sender); +} + +// Rust type: RustOpaqueMoi>> +abstract class SenderPluginCommand implements RustOpaqueInterface {} + +class SpotubePlugin { + final PluginArtistSender artist; + final PluginAlbumSender album; + final PluginAudioSourceSender audioSource; + final PluginAuthSender auth; + final PluginBrowseSender browse; + final PluginCoreSender core; + final PluginPlaylistSender playlist; + final PluginSearchSender search; + final PluginTrackSender track; + final PluginUserSender user; + + const SpotubePlugin.raw({ + required this.artist, + required this.album, + required this.audioSource, + required this.auth, + required this.browse, + required this.core, + required this.playlist, + required this.search, + required this.track, + required this.user, + }); + + Future dispose({required OpaqueSender tx}) => RustLib.instance.api + .crateApiPluginPluginSpotubePluginDispose(that: this, tx: tx); + + factory SpotubePlugin() => + RustLib.instance.api.crateApiPluginPluginSpotubePluginNew(); + + static OpaqueSender newContext( + {required String pluginScript, + required PluginConfiguration pluginConfig}) => + RustLib.instance.api.crateApiPluginPluginSpotubePluginNewContext( + pluginScript: pluginScript, pluginConfig: pluginConfig); + + @override + int get hashCode => + artist.hashCode ^ + album.hashCode ^ + audioSource.hashCode ^ + auth.hashCode ^ + browse.hashCode ^ + core.hashCode ^ + playlist.hashCode ^ + search.hashCode ^ + track.hashCode ^ + user.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is SpotubePlugin && + runtimeType == other.runtimeType && + artist == other.artist && + album == other.album && + audioSource == other.audioSource && + auth == other.auth && + browse == other.browse && + core == other.core && + playlist == other.playlist && + search == other.search && + track == other.track && + user == other.user; +} diff --git a/lib/src/rust/api/plugin/senders.dart b/lib/src/rust/api/plugin/senders.dart new file mode 100644 index 00000000..d54de212 --- /dev/null +++ b/lib/src/rust/api/plugin/senders.dart @@ -0,0 +1,444 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../frb_generated.dart'; +import 'models/album.dart'; +import 'models/artist.dart'; +import 'models/audio_source.dart'; +import 'models/browse.dart'; +import 'models/core.dart'; +import 'models/image.dart'; +import 'models/pagination.dart'; +import 'models/playlist.dart'; +import 'models/search.dart'; +import 'models/track.dart'; +import 'models/user.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; +import 'plugin.dart'; + +// These functions are ignored (category: IgnoreBecauseExplicitAttribute): `new`, `new`, `new`, `new`, `new`, `new`, `new`, `new`, `new`, `new` + +class PluginAlbumSender { + const PluginAlbumSender(); + + Future getAlbum( + {required OpaqueSender mpscTx, required String id}) => + RustLib.instance.api.crateApiPluginSendersPluginAlbumSenderGetAlbum( + that: this, mpscTx: mpscTx, id: id); + + Future releases( + {required OpaqueSender mpscTx, int? offset, int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginAlbumSenderReleases( + that: this, mpscTx: mpscTx, offset: offset, limit: limit); + + Future save( + {required OpaqueSender mpscTx, required List ids}) => + RustLib.instance.api.crateApiPluginSendersPluginAlbumSenderSave( + that: this, mpscTx: mpscTx, ids: ids); + + Future tracks( + {required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginAlbumSenderTracks( + that: this, mpscTx: mpscTx, id: id, offset: offset, limit: limit); + + Future unsave( + {required OpaqueSender mpscTx, required List ids}) => + RustLib.instance.api.crateApiPluginSendersPluginAlbumSenderUnsave( + that: this, mpscTx: mpscTx, ids: ids); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginAlbumSender && runtimeType == other.runtimeType; +} + +class PluginArtistSender { + const PluginArtistSender(); + + Future albums( + {required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginArtistSenderAlbums( + that: this, mpscTx: mpscTx, id: id, offset: offset, limit: limit); + + Future getArtist( + {required OpaqueSender mpscTx, required String id}) => + RustLib.instance.api.crateApiPluginSendersPluginArtistSenderGetArtist( + that: this, mpscTx: mpscTx, id: id); + + Future related( + {required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginArtistSenderRelated( + that: this, mpscTx: mpscTx, id: id, offset: offset, limit: limit); + + Future save( + {required OpaqueSender mpscTx, required List ids}) => + RustLib.instance.api.crateApiPluginSendersPluginArtistSenderSave( + that: this, mpscTx: mpscTx, ids: ids); + + Future topTracks( + {required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginArtistSenderTopTracks( + that: this, mpscTx: mpscTx, id: id, offset: offset, limit: limit); + + Future unsave( + {required OpaqueSender mpscTx, required List ids}) => + RustLib.instance.api.crateApiPluginSendersPluginArtistSenderUnsave( + that: this, mpscTx: mpscTx, ids: ids); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginArtistSender && runtimeType == other.runtimeType; +} + +class PluginAudioSourceSender { + const PluginAudioSourceSender(); + + Future> matches( + {required OpaqueSender mpscTx, required SpotubeTrackObject track}) => + RustLib.instance.api.crateApiPluginSendersPluginAudioSourceSenderMatches( + that: this, mpscTx: mpscTx, track: track); + + Future> streams( + {required OpaqueSender mpscTx, + required SpotubeAudioSourceMatchObject matched}) => + RustLib.instance.api.crateApiPluginSendersPluginAudioSourceSenderStreams( + that: this, mpscTx: mpscTx, matched: matched); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginAudioSourceSender && runtimeType == other.runtimeType; +} + +class PluginAuthSender { + const PluginAuthSender(); + + Future authenticate({required OpaqueSender mpscTx}) => + RustLib.instance.api.crateApiPluginSendersPluginAuthSenderAuthenticate( + that: this, mpscTx: mpscTx); + + Future isAuthenticated({required OpaqueSender mpscTx}) => + RustLib.instance.api.crateApiPluginSendersPluginAuthSenderIsAuthenticated( + that: this, mpscTx: mpscTx); + + Future logout({required OpaqueSender mpscTx}) => RustLib.instance.api + .crateApiPluginSendersPluginAuthSenderLogout(that: this, mpscTx: mpscTx); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginAuthSender && runtimeType == other.runtimeType; +} + +class PluginBrowseSender { + const PluginBrowseSender(); + + Future sectionItems( + {required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginBrowseSenderSectionItems( + that: this, mpscTx: mpscTx, id: id, offset: offset, limit: limit); + + Future sections( + {required OpaqueSender mpscTx, int? offset, int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginBrowseSenderSections( + that: this, mpscTx: mpscTx, offset: offset, limit: limit); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginBrowseSender && runtimeType == other.runtimeType; +} + +class PluginCoreSender { + const PluginCoreSender(); + + Future checkUpdate( + {required OpaqueSender mpscTx, + required PluginConfiguration pluginConfig}) => + RustLib.instance.api.crateApiPluginSendersPluginCoreSenderCheckUpdate( + that: this, mpscTx: mpscTx, pluginConfig: pluginConfig); + + Future scrobble( + {required OpaqueSender mpscTx, required ScrobbleDetails details}) => + RustLib.instance.api.crateApiPluginSendersPluginCoreSenderScrobble( + that: this, mpscTx: mpscTx, details: details); + + Future support({required OpaqueSender mpscTx}) => RustLib.instance.api + .crateApiPluginSendersPluginCoreSenderSupport(that: this, mpscTx: mpscTx); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginCoreSender && runtimeType == other.runtimeType; +} + +class PluginPlaylistSender { + const PluginPlaylistSender(); + + Future addTracks( + {required OpaqueSender mpscTx, + required String playlistId, + required List trackIds, + int? position}) => + RustLib.instance.api.crateApiPluginSendersPluginPlaylistSenderAddTracks( + that: this, + mpscTx: mpscTx, + playlistId: playlistId, + trackIds: trackIds, + position: position); + + Future createPlaylist( + {required OpaqueSender mpscTx, + required String userId, + required String name, + String? description, + bool? public, + bool? collaborative}) => + RustLib.instance.api + .crateApiPluginSendersPluginPlaylistSenderCreatePlaylist( + that: this, + mpscTx: mpscTx, + userId: userId, + name: name, + description: description, + public: public, + collaborative: collaborative); + + Future deletePlaylist( + {required OpaqueSender mpscTx, required String playlistId}) => + RustLib.instance.api + .crateApiPluginSendersPluginPlaylistSenderDeletePlaylist( + that: this, mpscTx: mpscTx, playlistId: playlistId); + + Future getPlaylist( + {required OpaqueSender mpscTx, required String id}) => + RustLib.instance.api.crateApiPluginSendersPluginPlaylistSenderGetPlaylist( + that: this, mpscTx: mpscTx, id: id); + + Future removeTracks( + {required OpaqueSender mpscTx, + required String playlistId, + required List trackIds}) => + RustLib.instance.api + .crateApiPluginSendersPluginPlaylistSenderRemoveTracks( + that: this, + mpscTx: mpscTx, + playlistId: playlistId, + trackIds: trackIds); + + Future save( + {required OpaqueSender mpscTx, required String playlistId}) => + RustLib.instance.api.crateApiPluginSendersPluginPlaylistSenderSave( + that: this, mpscTx: mpscTx, playlistId: playlistId); + + Future tracks( + {required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginPlaylistSenderTracks( + that: this, mpscTx: mpscTx, id: id, offset: offset, limit: limit); + + Future unsave( + {required OpaqueSender mpscTx, required String playlistId}) => + RustLib.instance.api.crateApiPluginSendersPluginPlaylistSenderUnsave( + that: this, mpscTx: mpscTx, playlistId: playlistId); + + Future updatePlaylist( + {required OpaqueSender mpscTx, + required String playlistId, + String? name, + String? description, + bool? public, + bool? collaborative}) => + RustLib.instance.api + .crateApiPluginSendersPluginPlaylistSenderUpdatePlaylist( + that: this, + mpscTx: mpscTx, + playlistId: playlistId, + name: name, + description: description, + public: public, + collaborative: collaborative); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginPlaylistSender && runtimeType == other.runtimeType; +} + +class PluginSearchSender { + const PluginSearchSender(); + + Future albums( + {required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginSearchSenderAlbums( + that: this, + mpscTx: mpscTx, + query: query, + offset: offset, + limit: limit); + + Future all( + {required OpaqueSender mpscTx, required String query}) => + RustLib.instance.api.crateApiPluginSendersPluginSearchSenderAll( + that: this, mpscTx: mpscTx, query: query); + + Future artists( + {required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginSearchSenderArtists( + that: this, + mpscTx: mpscTx, + query: query, + offset: offset, + limit: limit); + + Future> chips({required OpaqueSender mpscTx}) => RustLib + .instance.api + .crateApiPluginSendersPluginSearchSenderChips(that: this, mpscTx: mpscTx); + + Future playlists( + {required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginSearchSenderPlaylists( + that: this, + mpscTx: mpscTx, + query: query, + offset: offset, + limit: limit); + + Future tracks( + {required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginSearchSenderTracks( + that: this, + mpscTx: mpscTx, + query: query, + offset: offset, + limit: limit); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginSearchSender && runtimeType == other.runtimeType; +} + +class PluginTrackSender { + const PluginTrackSender(); + + Future getTrack( + {required OpaqueSender mpscTx, required String id}) => + RustLib.instance.api.crateApiPluginSendersPluginTrackSenderGetTrack( + that: this, mpscTx: mpscTx, id: id); + + Future> radio( + {required OpaqueSender mpscTx, required String id}) => + RustLib.instance.api.crateApiPluginSendersPluginTrackSenderRadio( + that: this, mpscTx: mpscTx, id: id); + + Future save( + {required OpaqueSender mpscTx, required List ids}) => + RustLib.instance.api.crateApiPluginSendersPluginTrackSenderSave( + that: this, mpscTx: mpscTx, ids: ids); + + Future unsave( + {required OpaqueSender mpscTx, required List ids}) => + RustLib.instance.api.crateApiPluginSendersPluginTrackSenderUnsave( + that: this, mpscTx: mpscTx, ids: ids); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginTrackSender && runtimeType == other.runtimeType; +} + +class PluginUserSender { + const PluginUserSender(); + + Future me({required OpaqueSender mpscTx}) => + RustLib.instance.api + .crateApiPluginSendersPluginUserSenderMe(that: this, mpscTx: mpscTx); + + Future savedAlbums( + {required OpaqueSender mpscTx, int? offset, int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginUserSenderSavedAlbums( + that: this, mpscTx: mpscTx, offset: offset, limit: limit); + + Future savedArtists( + {required OpaqueSender mpscTx, int? offset, int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginUserSenderSavedArtists( + that: this, mpscTx: mpscTx, offset: offset, limit: limit); + + Future savedPlaylists( + {required OpaqueSender mpscTx, int? offset, int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginUserSenderSavedPlaylists( + that: this, mpscTx: mpscTx, offset: offset, limit: limit); + + Future savedTracks( + {required OpaqueSender mpscTx, int? offset, int? limit}) => + RustLib.instance.api.crateApiPluginSendersPluginUserSenderSavedTracks( + that: this, mpscTx: mpscTx, offset: offset, limit: limit); + + @override + int get hashCode => 0; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is PluginUserSender && runtimeType == other.runtimeType; +} diff --git a/lib/src/rust/api/simple.dart b/lib/src/rust/api/simple.dart deleted file mode 100644 index b632d8b6..00000000 --- a/lib/src/rust/api/simple.dart +++ /dev/null @@ -1,10 +0,0 @@ -// This file is automatically generated, so please do not edit it. -// @generated by `flutter_rust_bridge`@ 2.11.1. - -// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import - -import '../frb_generated.dart'; -import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; - -String greet({required String name}) => - RustLib.instance.api.crateApiSimpleGreet(name: name); diff --git a/lib/src/rust/frb_generated.dart b/lib/src/rust/frb_generated.dart index 8bf0b31f..ccf493a3 100644 --- a/lib/src/rust/frb_generated.dart +++ b/lib/src/rust/frb_generated.dart @@ -3,7 +3,20 @@ // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field -import 'api/simple.dart'; +import 'api/plugin/commands.dart'; +import 'api/plugin/models/album.dart'; +import 'api/plugin/models/artist.dart'; +import 'api/plugin/models/audio_source.dart'; +import 'api/plugin/models/browse.dart'; +import 'api/plugin/models/core.dart'; +import 'api/plugin/models/image.dart'; +import 'api/plugin/models/pagination.dart'; +import 'api/plugin/models/playlist.dart'; +import 'api/plugin/models/search.dart'; +import 'api/plugin/models/track.dart'; +import 'api/plugin/models/user.dart'; +import 'api/plugin/plugin.dart'; +import 'api/plugin/senders.dart'; import 'dart:async'; import 'dart:convert'; import 'frb_generated.dart'; @@ -59,7 +72,7 @@ class RustLib extends BaseEntrypoint { @override Future executeRustInitializers() async { - await api.crateApiSimpleInitApp(); + await api.crateApiInitApp(); } @override @@ -70,7 +83,7 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.11.1'; @override - int get rustContentHash => -1918914929; + int get rustContentHash => -836755871; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -81,9 +94,336 @@ class RustLib extends BaseEntrypoint { } abstract class RustLibApi extends BaseApi { - String crateApiSimpleGreet({required String name}); + SenderPluginCommand crateApiPluginPluginOpaqueSenderAutoAccessorGetSender( + {required OpaqueSender that}); - Future crateApiSimpleInitApp(); + void crateApiPluginPluginOpaqueSenderAutoAccessorSetSender( + {required OpaqueSender that, required SenderPluginCommand sender}); + + Future crateApiInitApp(); + + Future crateApiPluginSendersPluginAlbumSenderGetAlbum( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required String id}); + + Future + crateApiPluginSendersPluginAlbumSenderReleases( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}); + + Future crateApiPluginSendersPluginAlbumSenderSave( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required List ids}); + + Future + crateApiPluginSendersPluginAlbumSenderTracks( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}); + + Future crateApiPluginSendersPluginAlbumSenderUnsave( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required List ids}); + + Future + crateApiPluginSendersPluginArtistSenderAlbums( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginArtistSenderGetArtist( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id}); + + Future + crateApiPluginSendersPluginArtistSenderRelated( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}); + + Future crateApiPluginSendersPluginArtistSenderSave( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required List ids}); + + Future + crateApiPluginSendersPluginArtistSenderTopTracks( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}); + + Future crateApiPluginSendersPluginArtistSenderUnsave( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required List ids}); + + Future> + crateApiPluginSendersPluginAudioSourceSenderMatches( + {required PluginAudioSourceSender that, + required OpaqueSender mpscTx, + required SpotubeTrackObject track}); + + Future> + crateApiPluginSendersPluginAudioSourceSenderStreams( + {required PluginAudioSourceSender that, + required OpaqueSender mpscTx, + required SpotubeAudioSourceMatchObject matched}); + + Future crateApiPluginSendersPluginAuthSenderAuthenticate( + {required PluginAuthSender that, required OpaqueSender mpscTx}); + + Future crateApiPluginSendersPluginAuthSenderIsAuthenticated( + {required PluginAuthSender that, required OpaqueSender mpscTx}); + + Future crateApiPluginSendersPluginAuthSenderLogout( + {required PluginAuthSender that, required OpaqueSender mpscTx}); + + Future + crateApiPluginSendersPluginBrowseSenderSectionItems( + {required PluginBrowseSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginBrowseSenderSections( + {required PluginBrowseSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}); + + Future crateApiPluginModelsCorePluginConfigurationSlug( + {required PluginConfiguration that}); + + Future + crateApiPluginSendersPluginCoreSenderCheckUpdate( + {required PluginCoreSender that, + required OpaqueSender mpscTx, + required PluginConfiguration pluginConfig}); + + Future crateApiPluginSendersPluginCoreSenderScrobble( + {required PluginCoreSender that, + required OpaqueSender mpscTx, + required ScrobbleDetails details}); + + Future crateApiPluginSendersPluginCoreSenderSupport( + {required PluginCoreSender that, required OpaqueSender mpscTx}); + + Future crateApiPluginSendersPluginPlaylistSenderAddTracks( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId, + required List trackIds, + int? position}); + + Future + crateApiPluginSendersPluginPlaylistSenderCreatePlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String userId, + required String name, + String? description, + bool? public, + bool? collaborative}); + + Future crateApiPluginSendersPluginPlaylistSenderDeletePlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId}); + + Future + crateApiPluginSendersPluginPlaylistSenderGetPlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String id}); + + Future crateApiPluginSendersPluginPlaylistSenderRemoveTracks( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId, + required List trackIds}); + + Future crateApiPluginSendersPluginPlaylistSenderSave( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId}); + + Future + crateApiPluginSendersPluginPlaylistSenderTracks( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}); + + Future crateApiPluginSendersPluginPlaylistSenderUnsave( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId}); + + Future crateApiPluginSendersPluginPlaylistSenderUpdatePlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId, + String? name, + String? description, + bool? public, + bool? collaborative}); + + Future + crateApiPluginSendersPluginSearchSenderAlbums( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginSearchSenderAll( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query}); + + Future + crateApiPluginSendersPluginSearchSenderArtists( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}); + + Future> crateApiPluginSendersPluginSearchSenderChips( + {required PluginSearchSender that, required OpaqueSender mpscTx}); + + Future + crateApiPluginSendersPluginSearchSenderPlaylists( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginSearchSenderTracks( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}); + + Future crateApiPluginSendersPluginTrackSenderGetTrack( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required String id}); + + Future> crateApiPluginSendersPluginTrackSenderRadio( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required String id}); + + Future crateApiPluginSendersPluginTrackSenderSave( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required List ids}); + + Future crateApiPluginSendersPluginTrackSenderUnsave( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required List ids}); + + Future crateApiPluginSendersPluginUserSenderMe( + {required PluginUserSender that, required OpaqueSender mpscTx}); + + Future + crateApiPluginSendersPluginUserSenderSavedAlbums( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginUserSenderSavedArtists( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginUserSenderSavedPlaylists( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}); + + Future + crateApiPluginSendersPluginUserSenderSavedTracks( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}); + + String + crateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmt( + {required SpotubeAudioLosslessContainerQuality that}); + + Future + crateApiPluginModelsAudioSourceSpotubeAudioLossyContainerQualityToStringFmt( + {required SpotubeAudioLossyContainerQuality that}); + + String + crateApiPluginModelsAudioSourceSpotubeAudioSourceContainerPresetFileExtension( + {required SpotubeAudioSourceContainerPreset that}); + + Future crateApiPluginPluginSpotubePluginDispose( + {required SpotubePlugin that, required OpaqueSender tx}); + + SpotubePlugin crateApiPluginPluginSpotubePluginNew(); + + OpaqueSender crateApiPluginPluginSpotubePluginNewContext( + {required String pluginScript, + required PluginConfiguration pluginConfig}); + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_OpaqueSender; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_OpaqueSender; + + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_OpaqueSenderPtr; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_PluginCommand; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_PluginCommand; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_PluginCommandPtr; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_SenderPluginCommand; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_SenderPluginCommand; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SenderPluginCommandPtr; } class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @@ -95,63 +435,2938 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { }); @override - String crateApiSimpleGreet({required String name}) { + SenderPluginCommand crateApiPluginPluginOpaqueSenderAutoAccessorGetSender( + {required OpaqueSender that}) { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(name, serializer); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + that, serializer); return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 1)!; }, codec: SseCodec( - decodeSuccessData: sse_decode_String, + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand, decodeErrorData: null, ), - constMeta: kCrateApiSimpleGreetConstMeta, - argValues: [name], + constMeta: + kCrateApiPluginPluginOpaqueSenderAutoAccessorGetSenderConstMeta, + argValues: [that], apiImpl: this, )); } - TaskConstMeta get kCrateApiSimpleGreetConstMeta => const TaskConstMeta( - debugName: "greet", - argNames: ["name"], - ); + TaskConstMeta + get kCrateApiPluginPluginOpaqueSenderAutoAccessorGetSenderConstMeta => + const TaskConstMeta( + debugName: "OpaqueSender_auto_accessor_get_sender", + argNames: ["that"], + ); @override - Future crateApiSimpleInitApp() { - return handler.executeNormal(NormalTask( - callFfi: (port_) { + void crateApiPluginPluginOpaqueSenderAutoAccessorSetSender( + {required OpaqueSender that, required SenderPluginCommand sender}) { + return handler.executeSync(SyncTask( + callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 2, port: port_); + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + sender, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 2)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, decodeErrorData: null, ), - constMeta: kCrateApiSimpleInitAppConstMeta, + constMeta: + kCrateApiPluginPluginOpaqueSenderAutoAccessorSetSenderConstMeta, + argValues: [that, sender], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginPluginOpaqueSenderAutoAccessorSetSenderConstMeta => + const TaskConstMeta( + debugName: "OpaqueSender_auto_accessor_set_sender", + argNames: ["that", "sender"], + ); + + @override + Future crateApiInitApp() { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 3, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiInitAppConstMeta, argValues: [], apiImpl: this, )); } - TaskConstMeta get kCrateApiSimpleInitAppConstMeta => const TaskConstMeta( + TaskConstMeta get kCrateApiInitAppConstMeta => const TaskConstMeta( debugName: "init_app", argNames: [], ); + @override + Future crateApiPluginSendersPluginAlbumSenderGetAlbum( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required String id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_album_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 4, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_full_album_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAlbumSenderGetAlbumConstMeta, + argValues: [that, mpscTx, id], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginAlbumSenderGetAlbumConstMeta => + const TaskConstMeta( + debugName: "plugin_album_sender_get_album", + argNames: ["that", "mpscTx", "id"], + ); + + @override + Future + crateApiPluginSendersPluginAlbumSenderReleases( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_album_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 5, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAlbumSenderReleasesConstMeta, + argValues: [that, mpscTx, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginAlbumSenderReleasesConstMeta => + const TaskConstMeta( + debugName: "plugin_album_sender_releases", + argNames: ["that", "mpscTx", "offset", "limit"], + ); + + @override + Future crateApiPluginSendersPluginAlbumSenderSave( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required List ids}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_album_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_list_String(ids, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 6, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAlbumSenderSaveConstMeta, + argValues: [that, mpscTx, ids], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginAlbumSenderSaveConstMeta => + const TaskConstMeta( + debugName: "plugin_album_sender_save", + argNames: ["that", "mpscTx", "ids"], + ); + + @override + Future + crateApiPluginSendersPluginAlbumSenderTracks( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_album_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 7, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAlbumSenderTracksConstMeta, + argValues: [that, mpscTx, id, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginAlbumSenderTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_album_sender_tracks", + argNames: ["that", "mpscTx", "id", "offset", "limit"], + ); + + @override + Future crateApiPluginSendersPluginAlbumSenderUnsave( + {required PluginAlbumSender that, + required OpaqueSender mpscTx, + required List ids}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_album_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_list_String(ids, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 8, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAlbumSenderUnsaveConstMeta, + argValues: [that, mpscTx, ids], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginAlbumSenderUnsaveConstMeta => + const TaskConstMeta( + debugName: "plugin_album_sender_unsave", + argNames: ["that", "mpscTx", "ids"], + ); + + @override + Future + crateApiPluginSendersPluginArtistSenderAlbums( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_artist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 9, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginArtistSenderAlbumsConstMeta, + argValues: [that, mpscTx, id, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginArtistSenderAlbumsConstMeta => + const TaskConstMeta( + debugName: "plugin_artist_sender_albums", + argNames: ["that", "mpscTx", "id", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginArtistSenderGetArtist( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_artist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 10, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_full_artist_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginArtistSenderGetArtistConstMeta, + argValues: [that, mpscTx, id], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginArtistSenderGetArtistConstMeta => + const TaskConstMeta( + debugName: "plugin_artist_sender_get_artist", + argNames: ["that", "mpscTx", "id"], + ); + + @override + Future + crateApiPluginSendersPluginArtistSenderRelated( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_artist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 11, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginArtistSenderRelatedConstMeta, + argValues: [that, mpscTx, id, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginArtistSenderRelatedConstMeta => + const TaskConstMeta( + debugName: "plugin_artist_sender_related", + argNames: ["that", "mpscTx", "id", "offset", "limit"], + ); + + @override + Future crateApiPluginSendersPluginArtistSenderSave( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required List ids}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_artist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_list_String(ids, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 12, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginArtistSenderSaveConstMeta, + argValues: [that, mpscTx, ids], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginArtistSenderSaveConstMeta => + const TaskConstMeta( + debugName: "plugin_artist_sender_save", + argNames: ["that", "mpscTx", "ids"], + ); + + @override + Future + crateApiPluginSendersPluginArtistSenderTopTracks( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_artist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 13, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginArtistSenderTopTracksConstMeta, + argValues: [that, mpscTx, id, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginArtistSenderTopTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_artist_sender_top_tracks", + argNames: ["that", "mpscTx", "id", "offset", "limit"], + ); + + @override + Future crateApiPluginSendersPluginArtistSenderUnsave( + {required PluginArtistSender that, + required OpaqueSender mpscTx, + required List ids}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_artist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_list_String(ids, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 14, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginArtistSenderUnsaveConstMeta, + argValues: [that, mpscTx, ids], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginArtistSenderUnsaveConstMeta => + const TaskConstMeta( + debugName: "plugin_artist_sender_unsave", + argNames: ["that", "mpscTx", "ids"], + ); + + @override + Future> + crateApiPluginSendersPluginAudioSourceSenderMatches( + {required PluginAudioSourceSender that, + required OpaqueSender mpscTx, + required SpotubeTrackObject track}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_audio_source_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_box_autoadd_spotube_track_object(track, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 15, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_spotube_audio_source_match_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAudioSourceSenderMatchesConstMeta, + argValues: [that, mpscTx, track], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginAudioSourceSenderMatchesConstMeta => + const TaskConstMeta( + debugName: "plugin_audio_source_sender_matches", + argNames: ["that", "mpscTx", "track"], + ); + + @override + Future> + crateApiPluginSendersPluginAudioSourceSenderStreams( + {required PluginAudioSourceSender that, + required OpaqueSender mpscTx, + required SpotubeAudioSourceMatchObject matched}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_audio_source_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_box_autoadd_spotube_audio_source_match_object( + matched, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 16, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_spotube_audio_source_stream_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAudioSourceSenderStreamsConstMeta, + argValues: [that, mpscTx, matched], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginAudioSourceSenderStreamsConstMeta => + const TaskConstMeta( + debugName: "plugin_audio_source_sender_streams", + argNames: ["that", "mpscTx", "matched"], + ); + + @override + Future crateApiPluginSendersPluginAuthSenderAuthenticate( + {required PluginAuthSender that, required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_auth_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 17, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAuthSenderAuthenticateConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginAuthSenderAuthenticateConstMeta => + const TaskConstMeta( + debugName: "plugin_auth_sender_authenticate", + argNames: ["that", "mpscTx"], + ); + + @override + Future crateApiPluginSendersPluginAuthSenderIsAuthenticated( + {required PluginAuthSender that, required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_auth_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 18, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_bool, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAuthSenderIsAuthenticatedConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginAuthSenderIsAuthenticatedConstMeta => + const TaskConstMeta( + debugName: "plugin_auth_sender_is_authenticated", + argNames: ["that", "mpscTx"], + ); + + @override + Future crateApiPluginSendersPluginAuthSenderLogout( + {required PluginAuthSender that, required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_auth_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 19, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginAuthSenderLogoutConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginAuthSenderLogoutConstMeta => + const TaskConstMeta( + debugName: "plugin_auth_sender_logout", + argNames: ["that", "mpscTx"], + ); + + @override + Future + crateApiPluginSendersPluginBrowseSenderSectionItems( + {required PluginBrowseSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_browse_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 20, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginBrowseSenderSectionItemsConstMeta, + argValues: [that, mpscTx, id, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginBrowseSenderSectionItemsConstMeta => + const TaskConstMeta( + debugName: "plugin_browse_sender_section_items", + argNames: ["that", "mpscTx", "id", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginBrowseSenderSections( + {required PluginBrowseSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_browse_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 21, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginBrowseSenderSectionsConstMeta, + argValues: [that, mpscTx, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginBrowseSenderSectionsConstMeta => + const TaskConstMeta( + debugName: "plugin_browse_sender_sections", + argNames: ["that", "mpscTx", "offset", "limit"], + ); + + @override + Future crateApiPluginModelsCorePluginConfigurationSlug( + {required PluginConfiguration that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_configuration(that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 22, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: kCrateApiPluginModelsCorePluginConfigurationSlugConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginModelsCorePluginConfigurationSlugConstMeta => + const TaskConstMeta( + debugName: "plugin_configuration_slug", + argNames: ["that"], + ); + + @override + Future + crateApiPluginSendersPluginCoreSenderCheckUpdate( + {required PluginCoreSender that, + required OpaqueSender mpscTx, + required PluginConfiguration pluginConfig}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_core_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_box_autoadd_plugin_configuration(pluginConfig, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 23, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_opt_box_autoadd_plugin_update_available, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginCoreSenderCheckUpdateConstMeta, + argValues: [that, mpscTx, pluginConfig], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginCoreSenderCheckUpdateConstMeta => + const TaskConstMeta( + debugName: "plugin_core_sender_check_update", + argNames: ["that", "mpscTx", "pluginConfig"], + ); + + @override + Future crateApiPluginSendersPluginCoreSenderScrobble( + {required PluginCoreSender that, + required OpaqueSender mpscTx, + required ScrobbleDetails details}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_core_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_box_autoadd_scrobble_details(details, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 24, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginCoreSenderScrobbleConstMeta, + argValues: [that, mpscTx, details], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginCoreSenderScrobbleConstMeta => + const TaskConstMeta( + debugName: "plugin_core_sender_scrobble", + argNames: ["that", "mpscTx", "details"], + ); + + @override + Future crateApiPluginSendersPluginCoreSenderSupport( + {required PluginCoreSender that, required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_core_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 25, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginCoreSenderSupportConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginCoreSenderSupportConstMeta => + const TaskConstMeta( + debugName: "plugin_core_sender_support", + argNames: ["that", "mpscTx"], + ); + + @override + Future crateApiPluginSendersPluginPlaylistSenderAddTracks( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId, + required List trackIds, + int? position}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(playlistId, serializer); + sse_encode_list_String(trackIds, serializer); + sse_encode_opt_box_autoadd_u_32(position, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 26, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginPlaylistSenderAddTracksConstMeta, + argValues: [that, mpscTx, playlistId, trackIds, position], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginPlaylistSenderAddTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_add_tracks", + argNames: ["that", "mpscTx", "playlistId", "trackIds", "position"], + ); + + @override + Future + crateApiPluginSendersPluginPlaylistSenderCreatePlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String userId, + required String name, + String? description, + bool? public, + bool? collaborative}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(userId, serializer); + sse_encode_String(name, serializer); + sse_encode_opt_String(description, serializer); + sse_encode_opt_box_autoadd_bool(public, serializer); + sse_encode_opt_box_autoadd_bool(collaborative, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 27, port: port_); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_opt_box_autoadd_spotube_full_playlist_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: + kCrateApiPluginSendersPluginPlaylistSenderCreatePlaylistConstMeta, + argValues: [ + that, + mpscTx, + userId, + name, + description, + public, + collaborative + ], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginPlaylistSenderCreatePlaylistConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_create_playlist", + argNames: [ + "that", + "mpscTx", + "userId", + "name", + "description", + "public", + "collaborative" + ], + ); + + @override + Future crateApiPluginSendersPluginPlaylistSenderDeletePlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(playlistId, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 28, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: + kCrateApiPluginSendersPluginPlaylistSenderDeletePlaylistConstMeta, + argValues: [that, mpscTx, playlistId], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginPlaylistSenderDeletePlaylistConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_delete_playlist", + argNames: ["that", "mpscTx", "playlistId"], + ); + + @override + Future + crateApiPluginSendersPluginPlaylistSenderGetPlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 29, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_full_playlist_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginPlaylistSenderGetPlaylistConstMeta, + argValues: [that, mpscTx, id], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginPlaylistSenderGetPlaylistConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_get_playlist", + argNames: ["that", "mpscTx", "id"], + ); + + @override + Future crateApiPluginSendersPluginPlaylistSenderRemoveTracks( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId, + required List trackIds}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(playlistId, serializer); + sse_encode_list_String(trackIds, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 30, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: + kCrateApiPluginSendersPluginPlaylistSenderRemoveTracksConstMeta, + argValues: [that, mpscTx, playlistId, trackIds], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginPlaylistSenderRemoveTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_remove_tracks", + argNames: ["that", "mpscTx", "playlistId", "trackIds"], + ); + + @override + Future crateApiPluginSendersPluginPlaylistSenderSave( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(playlistId, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 31, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginPlaylistSenderSaveConstMeta, + argValues: [that, mpscTx, playlistId], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginPlaylistSenderSaveConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_save", + argNames: ["that", "mpscTx", "playlistId"], + ); + + @override + Future + crateApiPluginSendersPluginPlaylistSenderTracks( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String id, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 32, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginPlaylistSenderTracksConstMeta, + argValues: [that, mpscTx, id, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginPlaylistSenderTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_tracks", + argNames: ["that", "mpscTx", "id", "offset", "limit"], + ); + + @override + Future crateApiPluginSendersPluginPlaylistSenderUnsave( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(playlistId, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 33, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginPlaylistSenderUnsaveConstMeta, + argValues: [that, mpscTx, playlistId], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginPlaylistSenderUnsaveConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_unsave", + argNames: ["that", "mpscTx", "playlistId"], + ); + + @override + Future crateApiPluginSendersPluginPlaylistSenderUpdatePlaylist( + {required PluginPlaylistSender that, + required OpaqueSender mpscTx, + required String playlistId, + String? name, + String? description, + bool? public, + bool? collaborative}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(playlistId, serializer); + sse_encode_opt_String(name, serializer); + sse_encode_opt_String(description, serializer); + sse_encode_opt_box_autoadd_bool(public, serializer); + sse_encode_opt_box_autoadd_bool(collaborative, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 34, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: + kCrateApiPluginSendersPluginPlaylistSenderUpdatePlaylistConstMeta, + argValues: [ + that, + mpscTx, + playlistId, + name, + description, + public, + collaborative + ], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginPlaylistSenderUpdatePlaylistConstMeta => + const TaskConstMeta( + debugName: "plugin_playlist_sender_update_playlist", + argNames: [ + "that", + "mpscTx", + "playlistId", + "name", + "description", + "public", + "collaborative" + ], + ); + + @override + Future + crateApiPluginSendersPluginSearchSenderAlbums( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_search_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(query, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 35, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginSearchSenderAlbumsConstMeta, + argValues: [that, mpscTx, query, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginSearchSenderAlbumsConstMeta => + const TaskConstMeta( + debugName: "plugin_search_sender_albums", + argNames: ["that", "mpscTx", "query", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginSearchSenderAll( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_search_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(query, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 36, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_search_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginSearchSenderAllConstMeta, + argValues: [that, mpscTx, query], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginSearchSenderAllConstMeta => + const TaskConstMeta( + debugName: "plugin_search_sender_all", + argNames: ["that", "mpscTx", "query"], + ); + + @override + Future + crateApiPluginSendersPluginSearchSenderArtists( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_search_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(query, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 37, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginSearchSenderArtistsConstMeta, + argValues: [that, mpscTx, query, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginSearchSenderArtistsConstMeta => + const TaskConstMeta( + debugName: "plugin_search_sender_artists", + argNames: ["that", "mpscTx", "query", "offset", "limit"], + ); + + @override + Future> crateApiPluginSendersPluginSearchSenderChips( + {required PluginSearchSender that, required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_search_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 38, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_String, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginSearchSenderChipsConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginSearchSenderChipsConstMeta => + const TaskConstMeta( + debugName: "plugin_search_sender_chips", + argNames: ["that", "mpscTx"], + ); + + @override + Future + crateApiPluginSendersPluginSearchSenderPlaylists( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_search_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(query, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 39, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginSearchSenderPlaylistsConstMeta, + argValues: [that, mpscTx, query, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginSearchSenderPlaylistsConstMeta => + const TaskConstMeta( + debugName: "plugin_search_sender_playlists", + argNames: ["that", "mpscTx", "query", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginSearchSenderTracks( + {required PluginSearchSender that, + required OpaqueSender mpscTx, + required String query, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_search_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(query, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 40, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginSearchSenderTracksConstMeta, + argValues: [that, mpscTx, query, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginSearchSenderTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_search_sender_tracks", + argNames: ["that", "mpscTx", "query", "offset", "limit"], + ); + + @override + Future crateApiPluginSendersPluginTrackSenderGetTrack( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required String id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_track_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 41, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_track_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginTrackSenderGetTrackConstMeta, + argValues: [that, mpscTx, id], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginTrackSenderGetTrackConstMeta => + const TaskConstMeta( + debugName: "plugin_track_sender_get_track", + argNames: ["that", "mpscTx", "id"], + ); + + @override + Future> crateApiPluginSendersPluginTrackSenderRadio( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required String id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_track_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_String(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 42, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_spotube_track_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginTrackSenderRadioConstMeta, + argValues: [that, mpscTx, id], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginTrackSenderRadioConstMeta => + const TaskConstMeta( + debugName: "plugin_track_sender_radio", + argNames: ["that", "mpscTx", "id"], + ); + + @override + Future crateApiPluginSendersPluginTrackSenderSave( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required List ids}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_track_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_list_String(ids, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 43, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginTrackSenderSaveConstMeta, + argValues: [that, mpscTx, ids], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginTrackSenderSaveConstMeta => + const TaskConstMeta( + debugName: "plugin_track_sender_save", + argNames: ["that", "mpscTx", "ids"], + ); + + @override + Future crateApiPluginSendersPluginTrackSenderUnsave( + {required PluginTrackSender that, + required OpaqueSender mpscTx, + required List ids}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_track_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_list_String(ids, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 44, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginTrackSenderUnsaveConstMeta, + argValues: [that, mpscTx, ids], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginTrackSenderUnsaveConstMeta => + const TaskConstMeta( + debugName: "plugin_track_sender_unsave", + argNames: ["that", "mpscTx", "ids"], + ); + + @override + Future crateApiPluginSendersPluginUserSenderMe( + {required PluginUserSender that, required OpaqueSender mpscTx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_user_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 45, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_user_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginUserSenderMeConstMeta, + argValues: [that, mpscTx], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginSendersPluginUserSenderMeConstMeta => + const TaskConstMeta( + debugName: "plugin_user_sender_me", + argNames: ["that", "mpscTx"], + ); + + @override + Future + crateApiPluginSendersPluginUserSenderSavedAlbums( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_user_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 46, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginUserSenderSavedAlbumsConstMeta, + argValues: [that, mpscTx, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginUserSenderSavedAlbumsConstMeta => + const TaskConstMeta( + debugName: "plugin_user_sender_saved_albums", + argNames: ["that", "mpscTx", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginUserSenderSavedArtists( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_user_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 47, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginUserSenderSavedArtistsConstMeta, + argValues: [that, mpscTx, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginUserSenderSavedArtistsConstMeta => + const TaskConstMeta( + debugName: "plugin_user_sender_saved_artists", + argNames: ["that", "mpscTx", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginUserSenderSavedPlaylists( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_user_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 48, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginUserSenderSavedPlaylistsConstMeta, + argValues: [that, mpscTx, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginUserSenderSavedPlaylistsConstMeta => + const TaskConstMeta( + debugName: "plugin_user_sender_saved_playlists", + argNames: ["that", "mpscTx", "offset", "limit"], + ); + + @override + Future + crateApiPluginSendersPluginUserSenderSavedTracks( + {required PluginUserSender that, + required OpaqueSender mpscTx, + int? offset, + int? limit}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_plugin_user_sender(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + mpscTx, serializer); + sse_encode_opt_box_autoadd_u_32(offset, serializer); + sse_encode_opt_box_autoadd_u_32(limit, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 49, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_pagination_response_object, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginSendersPluginUserSenderSavedTracksConstMeta, + argValues: [that, mpscTx, offset, limit], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginSendersPluginUserSenderSavedTracksConstMeta => + const TaskConstMeta( + debugName: "plugin_user_sender_saved_tracks", + argNames: ["that", "mpscTx", "offset", "limit"], + ); + + @override + String + crateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmt( + {required SpotubeAudioLosslessContainerQuality that}) { + return handler.executeSync(SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_spotube_audio_lossless_container_quality( + that, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 50)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: + kCrateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmtConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmtConstMeta => + const TaskConstMeta( + debugName: "spotube_audio_lossless_container_quality_to_string_fmt", + argNames: ["that"], + ); + + @override + Future + crateApiPluginModelsAudioSourceSpotubeAudioLossyContainerQualityToStringFmt( + {required SpotubeAudioLossyContainerQuality that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_spotube_audio_lossy_container_quality( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 51, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: + kCrateApiPluginModelsAudioSourceSpotubeAudioLossyContainerQualityToStringFmtConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginModelsAudioSourceSpotubeAudioLossyContainerQualityToStringFmtConstMeta => + const TaskConstMeta( + debugName: "spotube_audio_lossy_container_quality_to_string_fmt", + argNames: ["that"], + ); + + @override + String + crateApiPluginModelsAudioSourceSpotubeAudioSourceContainerPresetFileExtension( + {required SpotubeAudioSourceContainerPreset that}) { + return handler.executeSync(SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_spotube_audio_source_container_preset( + that, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 52)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, + ), + constMeta: + kCrateApiPluginModelsAudioSourceSpotubeAudioSourceContainerPresetFileExtensionConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiPluginModelsAudioSourceSpotubeAudioSourceContainerPresetFileExtensionConstMeta => + const TaskConstMeta( + debugName: "spotube_audio_source_container_preset_file_extension", + argNames: ["that"], + ); + + @override + Future crateApiPluginPluginSpotubePluginDispose( + {required SpotubePlugin that, required OpaqueSender tx}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_box_autoadd_spotube_plugin(that, serializer); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + tx, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 53, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginPluginSpotubePluginDisposeConstMeta, + argValues: [that, tx], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginPluginSpotubePluginDisposeConstMeta => + const TaskConstMeta( + debugName: "spotube_plugin_dispose", + argNames: ["that", "tx"], + ); + + @override + SpotubePlugin crateApiPluginPluginSpotubePluginNew() { + return handler.executeSync(SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 54)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_spotube_plugin, + decodeErrorData: null, + ), + constMeta: kCrateApiPluginPluginSpotubePluginNewConstMeta, + argValues: [], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginPluginSpotubePluginNewConstMeta => + const TaskConstMeta( + debugName: "spotube_plugin_new", + argNames: [], + ); + + @override + OpaqueSender crateApiPluginPluginSpotubePluginNewContext( + {required String pluginScript, + required PluginConfiguration pluginConfig}) { + return handler.executeSync(SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(pluginScript, serializer); + sse_encode_box_autoadd_plugin_configuration(pluginConfig, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 55)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiPluginPluginSpotubePluginNewContextConstMeta, + argValues: [pluginScript, pluginConfig], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiPluginPluginSpotubePluginNewContextConstMeta => + const TaskConstMeta( + debugName: "spotube_plugin_new_context", + argNames: ["pluginScript", "pluginConfig"], + ); + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_OpaqueSender => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_OpaqueSender => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_PluginCommand => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_PluginCommand => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand; + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_SenderPluginCommand => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_SenderPluginCommand => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand; + + @protected + AnyhowException dco_decode_AnyhowException(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return AnyhowException(raw as String); + } + + @protected + OpaqueSender + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + PluginCommand + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return PluginCommandImpl.frbInternalDcoDecode(raw as List); + } + + @protected + SenderPluginCommand + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return SenderPluginCommandImpl.frbInternalDcoDecode(raw as List); + } + + @protected + OpaqueSender + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + OpaqueSender + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + OpaqueSender + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalDcoDecode(raw as List); + } + + @protected + PluginCommand + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return PluginCommandImpl.frbInternalDcoDecode(raw as List); + } + + @protected + SenderPluginCommand + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return SenderPluginCommandImpl.frbInternalDcoDecode(raw as List); + } + @protected String dco_decode_String(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw as String; } + @protected + bool dco_decode_bool(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as bool; + } + + @protected + bool dco_decode_box_autoadd_bool(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as bool; + } + + @protected + double dco_decode_box_autoadd_f_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as double; + } + + @protected + int dco_decode_box_autoadd_i_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_i_64(raw); + } + + @protected + PluginAlbumSender dco_decode_box_autoadd_plugin_album_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_album_sender(raw); + } + + @protected + PluginArtistSender dco_decode_box_autoadd_plugin_artist_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_artist_sender(raw); + } + + @protected + PluginAudioSourceSender dco_decode_box_autoadd_plugin_audio_source_sender( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_audio_source_sender(raw); + } + + @protected + PluginAuthSender dco_decode_box_autoadd_plugin_auth_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_auth_sender(raw); + } + + @protected + PluginBrowseSender dco_decode_box_autoadd_plugin_browse_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_browse_sender(raw); + } + + @protected + PluginConfiguration dco_decode_box_autoadd_plugin_configuration(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_configuration(raw); + } + + @protected + PluginCoreSender dco_decode_box_autoadd_plugin_core_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_core_sender(raw); + } + + @protected + PluginPlaylistSender dco_decode_box_autoadd_plugin_playlist_sender( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_playlist_sender(raw); + } + + @protected + PluginSearchSender dco_decode_box_autoadd_plugin_search_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_search_sender(raw); + } + + @protected + PluginTrackSender dco_decode_box_autoadd_plugin_track_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_track_sender(raw); + } + + @protected + PluginUpdateAvailable dco_decode_box_autoadd_plugin_update_available( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_update_available(raw); + } + + @protected + PluginUserSender dco_decode_box_autoadd_plugin_user_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_plugin_user_sender(raw); + } + + @protected + ScrobbleDetails dco_decode_box_autoadd_scrobble_details(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_scrobble_details(raw); + } + + @protected + SpotubeAudioLosslessContainerQuality + dco_decode_box_autoadd_spotube_audio_lossless_container_quality( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_audio_lossless_container_quality(raw); + } + + @protected + SpotubeAudioLossyContainerQuality + dco_decode_box_autoadd_spotube_audio_lossy_container_quality( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_audio_lossy_container_quality(raw); + } + + @protected + SpotubeAudioSourceContainerPreset + dco_decode_box_autoadd_spotube_audio_source_container_preset( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_audio_source_container_preset(raw); + } + + @protected + SpotubeAudioSourceMatchObject + dco_decode_box_autoadd_spotube_audio_source_match_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_audio_source_match_object(raw); + } + + @protected + SpotubeBrowseSectionObject + dco_decode_box_autoadd_spotube_browse_section_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_browse_section_object(raw); + } + + @protected + SpotubeFullAlbumObject dco_decode_box_autoadd_spotube_full_album_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_full_album_object(raw); + } + + @protected + SpotubeFullArtistObject dco_decode_box_autoadd_spotube_full_artist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_full_artist_object(raw); + } + + @protected + SpotubeFullPlaylistObject dco_decode_box_autoadd_spotube_full_playlist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_full_playlist_object(raw); + } + + @protected + SpotubePlugin dco_decode_box_autoadd_spotube_plugin(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_plugin(raw); + } + + @protected + SpotubeSimpleAlbumObject dco_decode_box_autoadd_spotube_simple_album_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_simple_album_object(raw); + } + + @protected + SpotubeSimpleArtistObject dco_decode_box_autoadd_spotube_simple_artist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_simple_artist_object(raw); + } + + @protected + SpotubeSimplePlaylistObject + dco_decode_box_autoadd_spotube_simple_playlist_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_simple_playlist_object(raw); + } + + @protected + SpotubeTrackObject dco_decode_box_autoadd_spotube_track_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_spotube_track_object(raw); + } + + @protected + int dco_decode_box_autoadd_u_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + double dco_decode_f_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as double; + } + + @protected + int dco_decode_i_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + PlatformInt64 dco_decode_i_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeI64(raw); + } + + @protected + List dco_decode_list_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_String).toList(); + } + + @protected + List dco_decode_list_plugin_ability(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_plugin_ability).toList(); + } + + @protected + List dco_decode_list_plugin_api(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_plugin_api).toList(); + } + @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw as Uint8List; } + @protected + List dco_decode_list_scrobble_artist(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_scrobble_artist).toList(); + } + + @protected + List + dco_decode_list_spotube_audio_lossless_container_quality(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_audio_lossless_container_quality) + .toList(); + } + + @protected + List + dco_decode_list_spotube_audio_lossy_container_quality(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_audio_lossy_container_quality) + .toList(); + } + + @protected + List + dco_decode_list_spotube_audio_source_match_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_audio_source_match_object) + .toList(); + } + + @protected + List + dco_decode_list_spotube_audio_source_stream_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_audio_source_stream_object) + .toList(); + } + + @protected + List + dco_decode_list_spotube_browse_section_response_object_item(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_browse_section_response_object_item) + .toList(); + } + + @protected + List dco_decode_list_spotube_full_artist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_full_artist_object) + .toList(); + } + + @protected + List dco_decode_list_spotube_image_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_spotube_image_object).toList(); + } + + @protected + List + dco_decode_list_spotube_pagination_response_object_item(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_pagination_response_object_item) + .toList(); + } + + @protected + List dco_decode_list_spotube_simple_album_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_simple_album_object) + .toList(); + } + + @protected + List dco_decode_list_spotube_simple_artist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_simple_artist_object) + .toList(); + } + + @protected + List + dco_decode_list_spotube_simple_playlist_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_spotube_simple_playlist_object) + .toList(); + } + + @protected + List dco_decode_list_spotube_track_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_spotube_track_object).toList(); + } + + @protected + List dco_decode_list_spotube_user_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List).map(dco_decode_spotube_user_object).toList(); + } + + @protected + String? dco_decode_opt_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_String(raw); + } + + @protected + bool? dco_decode_opt_box_autoadd_bool(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_bool(raw); + } + + @protected + double? dco_decode_opt_box_autoadd_f_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_f_64(raw); + } + + @protected + int? dco_decode_opt_box_autoadd_i_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_i_32(raw); + } + + @protected + PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_i_64(raw); + } + + @protected + PluginUpdateAvailable? dco_decode_opt_box_autoadd_plugin_update_available( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null + ? null + : dco_decode_box_autoadd_plugin_update_available(raw); + } + + @protected + SpotubeFullPlaylistObject? + dco_decode_opt_box_autoadd_spotube_full_playlist_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null + ? null + : dco_decode_box_autoadd_spotube_full_playlist_object(raw); + } + + @protected + int? dco_decode_opt_box_autoadd_u_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_u_32(raw); + } + + @protected + List? dco_decode_opt_list_String(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_list_String(raw); + } + + @protected + List? dco_decode_opt_list_spotube_image_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_list_spotube_image_object(raw); + } + + @protected + PluginAbility dco_decode_plugin_ability(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return PluginAbility.values[raw as int]; + } + + @protected + PluginAlbumSender dco_decode_plugin_album_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginAlbumSender(); + } + + @protected + PluginApi dco_decode_plugin_api(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return PluginApi.values[raw as int]; + } + + @protected + PluginArtistSender dco_decode_plugin_artist_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginArtistSender(); + } + + @protected + PluginAudioSourceSender dco_decode_plugin_audio_source_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginAudioSourceSender(); + } + + @protected + PluginAuthSender dco_decode_plugin_auth_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginAuthSender(); + } + + @protected + PluginBrowseSender dco_decode_plugin_browse_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginBrowseSender(); + } + + @protected + PluginConfiguration dco_decode_plugin_configuration(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return PluginConfiguration( + name: dco_decode_String(arr[0]), + description: dco_decode_String(arr[1]), + version: dco_decode_String(arr[2]), + author: dco_decode_String(arr[3]), + entryPoint: dco_decode_String(arr[4]), + pluginApiVersion: dco_decode_String(arr[5]), + apis: dco_decode_list_plugin_api(arr[6]), + abilities: dco_decode_list_plugin_ability(arr[7]), + repository: dco_decode_opt_String(arr[8]), + ); + } + + @protected + PluginCoreSender dco_decode_plugin_core_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginCoreSender(); + } + + @protected + PluginPlaylistSender dco_decode_plugin_playlist_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginPlaylistSender(); + } + + @protected + PluginSearchSender dco_decode_plugin_search_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginSearchSender(); + } + + @protected + PluginTrackSender dco_decode_plugin_track_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginTrackSender(); + } + + @protected + PluginUpdateAvailable dco_decode_plugin_update_available(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 3) + throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); + return PluginUpdateAvailable( + downloadUrl: dco_decode_String(arr[0]), + version: dco_decode_String(arr[1]), + changelog: dco_decode_opt_String(arr[2]), + ); + } + + @protected + PluginUserSender dco_decode_plugin_user_sender(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.isNotEmpty) + throw Exception('unexpected arr length: expect 0 but see ${arr.length}'); + return const PluginUserSender(); + } + + @protected + ScrobbleAlbum dco_decode_scrobble_album(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return ScrobbleAlbum( + id: dco_decode_String(arr[0]), + name: dco_decode_String(arr[1]), + ); + } + + @protected + ScrobbleArtist dco_decode_scrobble_artist(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return ScrobbleArtist( + id: dco_decode_String(arr[0]), + name: dco_decode_String(arr[1]), + ); + } + + @protected + ScrobbleDetails dco_decode_scrobble_details(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return ScrobbleDetails( + id: dco_decode_String(arr[0]), + title: dco_decode_String(arr[1]), + artists: dco_decode_list_scrobble_artist(arr[2]), + album: dco_decode_scrobble_album(arr[3]), + timestamp: dco_decode_opt_box_autoadd_i_64(arr[4]), + durationMs: dco_decode_opt_box_autoadd_u_32(arr[5]), + isrc: dco_decode_opt_String(arr[6]), + ); + } + + @protected + SpotubeAlbumType dco_decode_spotube_album_type(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return SpotubeAlbumType.values[raw as int]; + } + + @protected + SpotubeAudioLosslessContainerQuality + dco_decode_spotube_audio_lossless_container_quality(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 2) + throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); + return SpotubeAudioLosslessContainerQuality( + bitDepth: dco_decode_i_32(arr[0]), + sampleRate: dco_decode_i_32(arr[1]), + ); + } + + @protected + SpotubeAudioLossyContainerQuality + dco_decode_spotube_audio_lossy_container_quality(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 1) + throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return SpotubeAudioLossyContainerQuality( + bitrate: dco_decode_i_32(arr[0]), + ); + } + + @protected + SpotubeAudioSourceContainerPreset + dco_decode_spotube_audio_source_container_preset(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return SpotubeAudioSourceContainerPreset_Lossy( + compressionType: dco_decode_spotube_media_compression_type(raw[1]), + name: dco_decode_String(raw[2]), + qualities: + dco_decode_list_spotube_audio_lossy_container_quality(raw[3]), + ); + case 1: + return SpotubeAudioSourceContainerPreset_Lossless( + compressionType: dco_decode_spotube_media_compression_type(raw[1]), + name: dco_decode_String(raw[2]), + qualities: + dco_decode_list_spotube_audio_lossless_container_quality(raw[3]), + ); + default: + throw Exception("unreachable"); + } + } + + @protected + SpotubeAudioSourceMatchObject dco_decode_spotube_audio_source_match_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return SpotubeAudioSourceMatchObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + title: dco_decode_String(arr[2]), + artists: dco_decode_list_String(arr[3]), + duration: dco_decode_u_64(arr[4]), + thumbnail: dco_decode_opt_String(arr[5]), + externalUri: dco_decode_String(arr[6]), + ); + } + + @protected + SpotubeAudioSourceStreamObject dco_decode_spotube_audio_source_stream_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return SpotubeAudioSourceStreamObject( + typeName: dco_decode_String(arr[0]), + url: dco_decode_String(arr[1]), + container: dco_decode_String(arr[2]), + compressionType: dco_decode_spotube_media_compression_type(arr[3]), + codec: dco_decode_opt_String(arr[4]), + bitrate: dco_decode_opt_box_autoadd_f_64(arr[5]), + bitDepth: dco_decode_opt_box_autoadd_i_32(arr[6]), + sampleRate: dco_decode_opt_box_autoadd_f_64(arr[7]), + ); + } + + @protected + SpotubeBrowseSectionObject dco_decode_spotube_browse_section_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 6) + throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); + return SpotubeBrowseSectionObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + title: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + browseMore: dco_decode_bool(arr[4]), + items: + dco_decode_list_spotube_browse_section_response_object_item(arr[5]), + ); + } + + @protected + SpotubeBrowseSectionResponseObjectItem + dco_decode_spotube_browse_section_response_object_item(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return SpotubeBrowseSectionResponseObjectItem_Track( + dco_decode_box_autoadd_spotube_track_object(raw[1]), + ); + case 1: + return SpotubeBrowseSectionResponseObjectItem_PlaylistFull( + dco_decode_box_autoadd_spotube_full_playlist_object(raw[1]), + ); + case 2: + return SpotubeBrowseSectionResponseObjectItem_PlaylistSimple( + dco_decode_box_autoadd_spotube_simple_playlist_object(raw[1]), + ); + case 3: + return SpotubeBrowseSectionResponseObjectItem_AlbumSimple( + dco_decode_box_autoadd_spotube_simple_album_object(raw[1]), + ); + case 4: + return SpotubeBrowseSectionResponseObjectItem_AlbumFull( + dco_decode_box_autoadd_spotube_full_album_object(raw[1]), + ); + case 5: + return SpotubeBrowseSectionResponseObjectItem_ArtistFull( + dco_decode_box_autoadd_spotube_full_artist_object(raw[1]), + ); + case 6: + return SpotubeBrowseSectionResponseObjectItem_ArtistSimple( + dco_decode_box_autoadd_spotube_simple_artist_object(raw[1]), + ); + default: + throw Exception("unreachable"); + } + } + + @protected + SpotubeFullAlbumObject dco_decode_spotube_full_album_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 11) + throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); + return SpotubeFullAlbumObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + artists: dco_decode_list_spotube_simple_artist_object(arr[3]), + images: dco_decode_list_spotube_image_object(arr[4]), + releaseDate: dco_decode_String(arr[5]), + externalUri: dco_decode_String(arr[6]), + totalTracks: dco_decode_i_32(arr[7]), + albumType: dco_decode_spotube_album_type(arr[8]), + recordLabel: dco_decode_opt_String(arr[9]), + genres: dco_decode_opt_list_String(arr[10]), + ); + } + + @protected + SpotubeFullArtistObject dco_decode_spotube_full_artist_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return SpotubeFullArtistObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + images: dco_decode_list_spotube_image_object(arr[4]), + genres: dco_decode_opt_list_String(arr[5]), + followers: dco_decode_opt_box_autoadd_i_32(arr[6]), + ); + } + + @protected + SpotubeFullPlaylistObject dco_decode_spotube_full_playlist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 10) + throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); + return SpotubeFullPlaylistObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + description: dco_decode_String(arr[3]), + externalUri: dco_decode_String(arr[4]), + owner: dco_decode_spotube_user_object(arr[5]), + images: dco_decode_list_spotube_image_object(arr[6]), + collaborators: dco_decode_list_spotube_user_object(arr[7]), + collaborative: dco_decode_bool(arr[8]), + public: dco_decode_bool(arr[9]), + ); + } + + @protected + SpotubeImageObject dco_decode_spotube_image_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) + throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return SpotubeImageObject( + typeName: dco_decode_String(arr[0]), + url: dco_decode_String(arr[1]), + width: dco_decode_opt_box_autoadd_i_32(arr[2]), + height: dco_decode_opt_box_autoadd_i_32(arr[3]), + ); + } + + @protected + SpotubeMediaCompressionType dco_decode_spotube_media_compression_type( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return SpotubeMediaCompressionType.values[raw as int]; + } + + @protected + SpotubePaginationResponseObject dco_decode_spotube_pagination_response_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return SpotubePaginationResponseObject( + limit: dco_decode_i_32(arr[0]), + nextOffset: dco_decode_opt_box_autoadd_i_32(arr[1]), + total: dco_decode_i_32(arr[2]), + hasMore: dco_decode_bool(arr[3]), + items: dco_decode_list_spotube_pagination_response_object_item(arr[4]), + ); + } + + @protected + SpotubePaginationResponseObjectItem + dco_decode_spotube_pagination_response_object_item(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return SpotubePaginationResponseObjectItem_Track( + dco_decode_box_autoadd_spotube_track_object(raw[1]), + ); + case 1: + return SpotubePaginationResponseObjectItem_PlaylistFull( + dco_decode_box_autoadd_spotube_full_playlist_object(raw[1]), + ); + case 2: + return SpotubePaginationResponseObjectItem_PlaylistSimple( + dco_decode_box_autoadd_spotube_simple_playlist_object(raw[1]), + ); + case 3: + return SpotubePaginationResponseObjectItem_AlbumSimple( + dco_decode_box_autoadd_spotube_simple_album_object(raw[1]), + ); + case 4: + return SpotubePaginationResponseObjectItem_AlbumFull( + dco_decode_box_autoadd_spotube_full_album_object(raw[1]), + ); + case 5: + return SpotubePaginationResponseObjectItem_ArtistFull( + dco_decode_box_autoadd_spotube_full_artist_object(raw[1]), + ); + case 6: + return SpotubePaginationResponseObjectItem_ArtistSimple( + dco_decode_box_autoadd_spotube_simple_artist_object(raw[1]), + ); + case 7: + return SpotubePaginationResponseObjectItem_BrowseSection( + dco_decode_box_autoadd_spotube_browse_section_object(raw[1]), + ); + default: + throw Exception("unreachable"); + } + } + + @protected + SpotubePlugin dco_decode_spotube_plugin(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 10) + throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); + return SpotubePlugin.raw( + artist: dco_decode_plugin_artist_sender(arr[0]), + album: dco_decode_plugin_album_sender(arr[1]), + audioSource: dco_decode_plugin_audio_source_sender(arr[2]), + auth: dco_decode_plugin_auth_sender(arr[3]), + browse: dco_decode_plugin_browse_sender(arr[4]), + core: dco_decode_plugin_core_sender(arr[5]), + playlist: dco_decode_plugin_playlist_sender(arr[6]), + search: dco_decode_plugin_search_sender(arr[7]), + track: dco_decode_plugin_track_sender(arr[8]), + user: dco_decode_plugin_user_sender(arr[9]), + ); + } + + @protected + SpotubeSearchResponseObject dco_decode_spotube_search_response_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return SpotubeSearchResponseObject( + typeName: dco_decode_String(arr[0]), + albums: dco_decode_list_spotube_simple_album_object(arr[1]), + artists: dco_decode_list_spotube_full_artist_object(arr[2]), + playlists: dco_decode_list_spotube_simple_playlist_object(arr[3]), + tracks: dco_decode_list_spotube_track_object(arr[4]), + ); + } + + @protected + SpotubeSimpleAlbumObject dco_decode_spotube_simple_album_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 8) + throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + return SpotubeSimpleAlbumObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + artists: dco_decode_list_spotube_simple_artist_object(arr[4]), + images: dco_decode_list_spotube_image_object(arr[5]), + albumType: dco_decode_spotube_album_type(arr[6]), + releaseDate: dco_decode_opt_String(arr[7]), + ); + } + + @protected + SpotubeSimpleArtistObject dco_decode_spotube_simple_artist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return SpotubeSimpleArtistObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + images: dco_decode_opt_list_spotube_image_object(arr[4]), + ); + } + + @protected + SpotubeSimplePlaylistObject dco_decode_spotube_simple_playlist_object( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 7) + throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + return SpotubeSimplePlaylistObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + description: dco_decode_String(arr[3]), + externalUri: dco_decode_String(arr[4]), + owner: dco_decode_spotube_user_object(arr[5]), + images: dco_decode_list_spotube_image_object(arr[6]), + ); + } + + @protected + SpotubeTrackObject dco_decode_spotube_track_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 9) + throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); + return SpotubeTrackObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + externalUri: dco_decode_String(arr[3]), + artists: dco_decode_list_spotube_simple_artist_object(arr[4]), + album: dco_decode_spotube_simple_album_object(arr[5]), + durationMs: dco_decode_u_64(arr[6]), + isrc: dco_decode_String(arr[7]), + explicit: dco_decode_bool(arr[8]), + ); + } + + @protected + SpotubeUserObject dco_decode_spotube_user_object(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 5) + throw Exception('unexpected arr length: expect 5 but see ${arr.length}'); + return SpotubeUserObject( + typeName: dco_decode_String(arr[0]), + id: dco_decode_String(arr[1]), + name: dco_decode_String(arr[2]), + images: dco_decode_list_spotube_image_object(arr[3]), + externalUri: dco_decode_String(arr[4]), + ); + } + + @protected + int dco_decode_u_32(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as int; + } + + @protected + BigInt dco_decode_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); + } + @protected int dco_decode_u_8(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -164,6 +3379,91 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return; } + @protected + BigInt dco_decode_usize(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); + } + + @protected + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_String(deserializer); + return AnyhowException(inner); + } + + @protected + OpaqueSender + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + PluginCommand + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return PluginCommandImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + SenderPluginCommand + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return SenderPluginCommandImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + OpaqueSender + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + OpaqueSender + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + OpaqueSender + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return OpaqueSenderImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + PluginCommand + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return PluginCommandImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + + @protected + SenderPluginCommand + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return SenderPluginCommandImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + @protected String sse_decode_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -171,6 +3471,285 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return utf8.decoder.convert(inner); } + @protected + bool sse_decode_bool(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getUint8() != 0; + } + + @protected + bool sse_decode_box_autoadd_bool(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_bool(deserializer)); + } + + @protected + double sse_decode_box_autoadd_f_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_f_64(deserializer)); + } + + @protected + int sse_decode_box_autoadd_i_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_i_32(deserializer)); + } + + @protected + PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_i_64(deserializer)); + } + + @protected + PluginAlbumSender sse_decode_box_autoadd_plugin_album_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_album_sender(deserializer)); + } + + @protected + PluginArtistSender sse_decode_box_autoadd_plugin_artist_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_artist_sender(deserializer)); + } + + @protected + PluginAudioSourceSender sse_decode_box_autoadd_plugin_audio_source_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_audio_source_sender(deserializer)); + } + + @protected + PluginAuthSender sse_decode_box_autoadd_plugin_auth_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_auth_sender(deserializer)); + } + + @protected + PluginBrowseSender sse_decode_box_autoadd_plugin_browse_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_browse_sender(deserializer)); + } + + @protected + PluginConfiguration sse_decode_box_autoadd_plugin_configuration( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_configuration(deserializer)); + } + + @protected + PluginCoreSender sse_decode_box_autoadd_plugin_core_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_core_sender(deserializer)); + } + + @protected + PluginPlaylistSender sse_decode_box_autoadd_plugin_playlist_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_playlist_sender(deserializer)); + } + + @protected + PluginSearchSender sse_decode_box_autoadd_plugin_search_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_search_sender(deserializer)); + } + + @protected + PluginTrackSender sse_decode_box_autoadd_plugin_track_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_track_sender(deserializer)); + } + + @protected + PluginUpdateAvailable sse_decode_box_autoadd_plugin_update_available( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_update_available(deserializer)); + } + + @protected + PluginUserSender sse_decode_box_autoadd_plugin_user_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_plugin_user_sender(deserializer)); + } + + @protected + ScrobbleDetails sse_decode_box_autoadd_scrobble_details( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_scrobble_details(deserializer)); + } + + @protected + SpotubeAudioLosslessContainerQuality + sse_decode_box_autoadd_spotube_audio_lossless_container_quality( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_audio_lossless_container_quality(deserializer)); + } + + @protected + SpotubeAudioLossyContainerQuality + sse_decode_box_autoadd_spotube_audio_lossy_container_quality( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_audio_lossy_container_quality(deserializer)); + } + + @protected + SpotubeAudioSourceContainerPreset + sse_decode_box_autoadd_spotube_audio_source_container_preset( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_audio_source_container_preset(deserializer)); + } + + @protected + SpotubeAudioSourceMatchObject + sse_decode_box_autoadd_spotube_audio_source_match_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_audio_source_match_object(deserializer)); + } + + @protected + SpotubeBrowseSectionObject + sse_decode_box_autoadd_spotube_browse_section_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_browse_section_object(deserializer)); + } + + @protected + SpotubeFullAlbumObject sse_decode_box_autoadd_spotube_full_album_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_full_album_object(deserializer)); + } + + @protected + SpotubeFullArtistObject sse_decode_box_autoadd_spotube_full_artist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_full_artist_object(deserializer)); + } + + @protected + SpotubeFullPlaylistObject sse_decode_box_autoadd_spotube_full_playlist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_full_playlist_object(deserializer)); + } + + @protected + SpotubePlugin sse_decode_box_autoadd_spotube_plugin( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_plugin(deserializer)); + } + + @protected + SpotubeSimpleAlbumObject sse_decode_box_autoadd_spotube_simple_album_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_simple_album_object(deserializer)); + } + + @protected + SpotubeSimpleArtistObject sse_decode_box_autoadd_spotube_simple_artist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_simple_artist_object(deserializer)); + } + + @protected + SpotubeSimplePlaylistObject + sse_decode_box_autoadd_spotube_simple_playlist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_simple_playlist_object(deserializer)); + } + + @protected + SpotubeTrackObject sse_decode_box_autoadd_spotube_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_spotube_track_object(deserializer)); + } + + @protected + int sse_decode_box_autoadd_u_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_u_32(deserializer)); + } + + @protected + double sse_decode_f_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getFloat64(); + } + + @protected + int sse_decode_i_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getInt32(); + } + + @protected + PlatformInt64 sse_decode_i_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getPlatformInt64(); + } + + @protected + List sse_decode_list_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_String(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_plugin_ability( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_plugin_ability(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_plugin_api(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_plugin_api(deserializer)); + } + return ans_; + } + @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -178,6 +3757,961 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getUint8List(len_); } + @protected + List sse_decode_list_scrobble_artist( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_scrobble_artist(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_audio_lossless_container_quality( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_spotube_audio_lossless_container_quality(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_audio_lossy_container_quality( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_audio_lossy_container_quality(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_audio_source_match_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_audio_source_match_object(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_audio_source_stream_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_audio_source_stream_object(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_browse_section_response_object_item( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_spotube_browse_section_response_object_item(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_spotube_full_artist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_full_artist_object(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_spotube_image_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_image_object(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_pagination_response_object_item( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add( + sse_decode_spotube_pagination_response_object_item(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_spotube_simple_album_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_simple_album_object(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_spotube_simple_artist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_simple_artist_object(deserializer)); + } + return ans_; + } + + @protected + List + sse_decode_list_spotube_simple_playlist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_simple_playlist_object(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_spotube_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_track_object(deserializer)); + } + return ans_; + } + + @protected + List sse_decode_list_spotube_user_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var len_ = sse_decode_i_32(deserializer); + var ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_spotube_user_object(deserializer)); + } + return ans_; + } + + @protected + String? sse_decode_opt_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_String(deserializer)); + } else { + return null; + } + } + + @protected + bool? sse_decode_opt_box_autoadd_bool(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_bool(deserializer)); + } else { + return null; + } + } + + @protected + double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_f_64(deserializer)); + } else { + return null; + } + } + + @protected + int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_i_32(deserializer)); + } else { + return null; + } + } + + @protected + PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_i_64(deserializer)); + } else { + return null; + } + } + + @protected + PluginUpdateAvailable? sse_decode_opt_box_autoadd_plugin_update_available( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_plugin_update_available(deserializer)); + } else { + return null; + } + } + + @protected + SpotubeFullPlaylistObject? + sse_decode_opt_box_autoadd_spotube_full_playlist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_spotube_full_playlist_object( + deserializer)); + } else { + return null; + } + } + + @protected + int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_u_32(deserializer)); + } else { + return null; + } + } + + @protected + List? sse_decode_opt_list_String(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_list_String(deserializer)); + } else { + return null; + } + } + + @protected + List? sse_decode_opt_list_spotube_image_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_list_spotube_image_object(deserializer)); + } else { + return null; + } + } + + @protected + PluginAbility sse_decode_plugin_ability(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return PluginAbility.values[inner]; + } + + @protected + PluginAlbumSender sse_decode_plugin_album_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginAlbumSender(); + } + + @protected + PluginApi sse_decode_plugin_api(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return PluginApi.values[inner]; + } + + @protected + PluginArtistSender sse_decode_plugin_artist_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginArtistSender(); + } + + @protected + PluginAudioSourceSender sse_decode_plugin_audio_source_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginAudioSourceSender(); + } + + @protected + PluginAuthSender sse_decode_plugin_auth_sender(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginAuthSender(); + } + + @protected + PluginBrowseSender sse_decode_plugin_browse_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginBrowseSender(); + } + + @protected + PluginConfiguration sse_decode_plugin_configuration( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_name = sse_decode_String(deserializer); + var var_description = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_author = sse_decode_String(deserializer); + var var_entryPoint = sse_decode_String(deserializer); + var var_pluginApiVersion = sse_decode_String(deserializer); + var var_apis = sse_decode_list_plugin_api(deserializer); + var var_abilities = sse_decode_list_plugin_ability(deserializer); + var var_repository = sse_decode_opt_String(deserializer); + return PluginConfiguration( + name: var_name, + description: var_description, + version: var_version, + author: var_author, + entryPoint: var_entryPoint, + pluginApiVersion: var_pluginApiVersion, + apis: var_apis, + abilities: var_abilities, + repository: var_repository); + } + + @protected + PluginCoreSender sse_decode_plugin_core_sender(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginCoreSender(); + } + + @protected + PluginPlaylistSender sse_decode_plugin_playlist_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginPlaylistSender(); + } + + @protected + PluginSearchSender sse_decode_plugin_search_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginSearchSender(); + } + + @protected + PluginTrackSender sse_decode_plugin_track_sender( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginTrackSender(); + } + + @protected + PluginUpdateAvailable sse_decode_plugin_update_available( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_downloadUrl = sse_decode_String(deserializer); + var var_version = sse_decode_String(deserializer); + var var_changelog = sse_decode_opt_String(deserializer); + return PluginUpdateAvailable( + downloadUrl: var_downloadUrl, + version: var_version, + changelog: var_changelog); + } + + @protected + PluginUserSender sse_decode_plugin_user_sender(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return const PluginUserSender(); + } + + @protected + ScrobbleAlbum sse_decode_scrobble_album(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + return ScrobbleAlbum(id: var_id, name: var_name); + } + + @protected + ScrobbleArtist sse_decode_scrobble_artist(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + return ScrobbleArtist(id: var_id, name: var_name); + } + + @protected + ScrobbleDetails sse_decode_scrobble_details(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_id = sse_decode_String(deserializer); + var var_title = sse_decode_String(deserializer); + var var_artists = sse_decode_list_scrobble_artist(deserializer); + var var_album = sse_decode_scrobble_album(deserializer); + var var_timestamp = sse_decode_opt_box_autoadd_i_64(deserializer); + var var_durationMs = sse_decode_opt_box_autoadd_u_32(deserializer); + var var_isrc = sse_decode_opt_String(deserializer); + return ScrobbleDetails( + id: var_id, + title: var_title, + artists: var_artists, + album: var_album, + timestamp: var_timestamp, + durationMs: var_durationMs, + isrc: var_isrc); + } + + @protected + SpotubeAlbumType sse_decode_spotube_album_type(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return SpotubeAlbumType.values[inner]; + } + + @protected + SpotubeAudioLosslessContainerQuality + sse_decode_spotube_audio_lossless_container_quality( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_bitDepth = sse_decode_i_32(deserializer); + var var_sampleRate = sse_decode_i_32(deserializer); + return SpotubeAudioLosslessContainerQuality( + bitDepth: var_bitDepth, sampleRate: var_sampleRate); + } + + @protected + SpotubeAudioLossyContainerQuality + sse_decode_spotube_audio_lossy_container_quality( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_bitrate = sse_decode_i_32(deserializer); + return SpotubeAudioLossyContainerQuality(bitrate: var_bitrate); + } + + @protected + SpotubeAudioSourceContainerPreset + sse_decode_spotube_audio_source_container_preset( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_compressionType = + sse_decode_spotube_media_compression_type(deserializer); + var var_name = sse_decode_String(deserializer); + var var_qualities = + sse_decode_list_spotube_audio_lossy_container_quality(deserializer); + return SpotubeAudioSourceContainerPreset_Lossy( + compressionType: var_compressionType, + name: var_name, + qualities: var_qualities); + case 1: + var var_compressionType = + sse_decode_spotube_media_compression_type(deserializer); + var var_name = sse_decode_String(deserializer); + var var_qualities = + sse_decode_list_spotube_audio_lossless_container_quality( + deserializer); + return SpotubeAudioSourceContainerPreset_Lossless( + compressionType: var_compressionType, + name: var_name, + qualities: var_qualities); + default: + throw UnimplementedError(''); + } + } + + @protected + SpotubeAudioSourceMatchObject sse_decode_spotube_audio_source_match_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_title = sse_decode_String(deserializer); + var var_artists = sse_decode_list_String(deserializer); + var var_duration = sse_decode_u_64(deserializer); + var var_thumbnail = sse_decode_opt_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + return SpotubeAudioSourceMatchObject( + typeName: var_typeName, + id: var_id, + title: var_title, + artists: var_artists, + duration: var_duration, + thumbnail: var_thumbnail, + externalUri: var_externalUri); + } + + @protected + SpotubeAudioSourceStreamObject sse_decode_spotube_audio_source_stream_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_url = sse_decode_String(deserializer); + var var_container = sse_decode_String(deserializer); + var var_compressionType = + sse_decode_spotube_media_compression_type(deserializer); + var var_codec = sse_decode_opt_String(deserializer); + var var_bitrate = sse_decode_opt_box_autoadd_f_64(deserializer); + var var_bitDepth = sse_decode_opt_box_autoadd_i_32(deserializer); + var var_sampleRate = sse_decode_opt_box_autoadd_f_64(deserializer); + return SpotubeAudioSourceStreamObject( + typeName: var_typeName, + url: var_url, + container: var_container, + compressionType: var_compressionType, + codec: var_codec, + bitrate: var_bitrate, + bitDepth: var_bitDepth, + sampleRate: var_sampleRate); + } + + @protected + SpotubeBrowseSectionObject sse_decode_spotube_browse_section_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_title = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_browseMore = sse_decode_bool(deserializer); + var var_items = sse_decode_list_spotube_browse_section_response_object_item( + deserializer); + return SpotubeBrowseSectionObject( + typeName: var_typeName, + id: var_id, + title: var_title, + externalUri: var_externalUri, + browseMore: var_browseMore, + items: var_items); + } + + @protected + SpotubeBrowseSectionResponseObjectItem + sse_decode_spotube_browse_section_response_object_item( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = + sse_decode_box_autoadd_spotube_track_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_Track(var_field0); + case 1: + var var_field0 = + sse_decode_box_autoadd_spotube_full_playlist_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_PlaylistFull(var_field0); + case 2: + var var_field0 = + sse_decode_box_autoadd_spotube_simple_playlist_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_PlaylistSimple( + var_field0); + case 3: + var var_field0 = + sse_decode_box_autoadd_spotube_simple_album_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_AlbumSimple(var_field0); + case 4: + var var_field0 = + sse_decode_box_autoadd_spotube_full_album_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_AlbumFull(var_field0); + case 5: + var var_field0 = + sse_decode_box_autoadd_spotube_full_artist_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_ArtistFull(var_field0); + case 6: + var var_field0 = + sse_decode_box_autoadd_spotube_simple_artist_object(deserializer); + return SpotubeBrowseSectionResponseObjectItem_ArtistSimple(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + SpotubeFullAlbumObject sse_decode_spotube_full_album_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_artists = + sse_decode_list_spotube_simple_artist_object(deserializer); + var var_images = sse_decode_list_spotube_image_object(deserializer); + var var_releaseDate = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_totalTracks = sse_decode_i_32(deserializer); + var var_albumType = sse_decode_spotube_album_type(deserializer); + var var_recordLabel = sse_decode_opt_String(deserializer); + var var_genres = sse_decode_opt_list_String(deserializer); + return SpotubeFullAlbumObject( + typeName: var_typeName, + id: var_id, + name: var_name, + artists: var_artists, + images: var_images, + releaseDate: var_releaseDate, + externalUri: var_externalUri, + totalTracks: var_totalTracks, + albumType: var_albumType, + recordLabel: var_recordLabel, + genres: var_genres); + } + + @protected + SpotubeFullArtistObject sse_decode_spotube_full_artist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_images = sse_decode_list_spotube_image_object(deserializer); + var var_genres = sse_decode_opt_list_String(deserializer); + var var_followers = sse_decode_opt_box_autoadd_i_32(deserializer); + return SpotubeFullArtistObject( + typeName: var_typeName, + id: var_id, + name: var_name, + externalUri: var_externalUri, + images: var_images, + genres: var_genres, + followers: var_followers); + } + + @protected + SpotubeFullPlaylistObject sse_decode_spotube_full_playlist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_description = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_owner = sse_decode_spotube_user_object(deserializer); + var var_images = sse_decode_list_spotube_image_object(deserializer); + var var_collaborators = sse_decode_list_spotube_user_object(deserializer); + var var_collaborative = sse_decode_bool(deserializer); + var var_public = sse_decode_bool(deserializer); + return SpotubeFullPlaylistObject( + typeName: var_typeName, + id: var_id, + name: var_name, + description: var_description, + externalUri: var_externalUri, + owner: var_owner, + images: var_images, + collaborators: var_collaborators, + collaborative: var_collaborative, + public: var_public); + } + + @protected + SpotubeImageObject sse_decode_spotube_image_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_url = sse_decode_String(deserializer); + var var_width = sse_decode_opt_box_autoadd_i_32(deserializer); + var var_height = sse_decode_opt_box_autoadd_i_32(deserializer); + return SpotubeImageObject( + typeName: var_typeName, + url: var_url, + width: var_width, + height: var_height); + } + + @protected + SpotubeMediaCompressionType sse_decode_spotube_media_compression_type( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_i_32(deserializer); + return SpotubeMediaCompressionType.values[inner]; + } + + @protected + SpotubePaginationResponseObject sse_decode_spotube_pagination_response_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_limit = sse_decode_i_32(deserializer); + var var_nextOffset = sse_decode_opt_box_autoadd_i_32(deserializer); + var var_total = sse_decode_i_32(deserializer); + var var_hasMore = sse_decode_bool(deserializer); + var var_items = + sse_decode_list_spotube_pagination_response_object_item(deserializer); + return SpotubePaginationResponseObject( + limit: var_limit, + nextOffset: var_nextOffset, + total: var_total, + hasMore: var_hasMore, + items: var_items); + } + + @protected + SpotubePaginationResponseObjectItem + sse_decode_spotube_pagination_response_object_item( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_field0 = + sse_decode_box_autoadd_spotube_track_object(deserializer); + return SpotubePaginationResponseObjectItem_Track(var_field0); + case 1: + var var_field0 = + sse_decode_box_autoadd_spotube_full_playlist_object(deserializer); + return SpotubePaginationResponseObjectItem_PlaylistFull(var_field0); + case 2: + var var_field0 = + sse_decode_box_autoadd_spotube_simple_playlist_object(deserializer); + return SpotubePaginationResponseObjectItem_PlaylistSimple(var_field0); + case 3: + var var_field0 = + sse_decode_box_autoadd_spotube_simple_album_object(deserializer); + return SpotubePaginationResponseObjectItem_AlbumSimple(var_field0); + case 4: + var var_field0 = + sse_decode_box_autoadd_spotube_full_album_object(deserializer); + return SpotubePaginationResponseObjectItem_AlbumFull(var_field0); + case 5: + var var_field0 = + sse_decode_box_autoadd_spotube_full_artist_object(deserializer); + return SpotubePaginationResponseObjectItem_ArtistFull(var_field0); + case 6: + var var_field0 = + sse_decode_box_autoadd_spotube_simple_artist_object(deserializer); + return SpotubePaginationResponseObjectItem_ArtistSimple(var_field0); + case 7: + var var_field0 = + sse_decode_box_autoadd_spotube_browse_section_object(deserializer); + return SpotubePaginationResponseObjectItem_BrowseSection(var_field0); + default: + throw UnimplementedError(''); + } + } + + @protected + SpotubePlugin sse_decode_spotube_plugin(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_artist = sse_decode_plugin_artist_sender(deserializer); + var var_album = sse_decode_plugin_album_sender(deserializer); + var var_audioSource = sse_decode_plugin_audio_source_sender(deserializer); + var var_auth = sse_decode_plugin_auth_sender(deserializer); + var var_browse = sse_decode_plugin_browse_sender(deserializer); + var var_core = sse_decode_plugin_core_sender(deserializer); + var var_playlist = sse_decode_plugin_playlist_sender(deserializer); + var var_search = sse_decode_plugin_search_sender(deserializer); + var var_track = sse_decode_plugin_track_sender(deserializer); + var var_user = sse_decode_plugin_user_sender(deserializer); + return SpotubePlugin.raw( + artist: var_artist, + album: var_album, + audioSource: var_audioSource, + auth: var_auth, + browse: var_browse, + core: var_core, + playlist: var_playlist, + search: var_search, + track: var_track, + user: var_user); + } + + @protected + SpotubeSearchResponseObject sse_decode_spotube_search_response_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_albums = sse_decode_list_spotube_simple_album_object(deserializer); + var var_artists = sse_decode_list_spotube_full_artist_object(deserializer); + var var_playlists = + sse_decode_list_spotube_simple_playlist_object(deserializer); + var var_tracks = sse_decode_list_spotube_track_object(deserializer); + return SpotubeSearchResponseObject( + typeName: var_typeName, + albums: var_albums, + artists: var_artists, + playlists: var_playlists, + tracks: var_tracks); + } + + @protected + SpotubeSimpleAlbumObject sse_decode_spotube_simple_album_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_artists = + sse_decode_list_spotube_simple_artist_object(deserializer); + var var_images = sse_decode_list_spotube_image_object(deserializer); + var var_albumType = sse_decode_spotube_album_type(deserializer); + var var_releaseDate = sse_decode_opt_String(deserializer); + return SpotubeSimpleAlbumObject( + typeName: var_typeName, + id: var_id, + name: var_name, + externalUri: var_externalUri, + artists: var_artists, + images: var_images, + albumType: var_albumType, + releaseDate: var_releaseDate); + } + + @protected + SpotubeSimpleArtistObject sse_decode_spotube_simple_artist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_images = sse_decode_opt_list_spotube_image_object(deserializer); + return SpotubeSimpleArtistObject( + typeName: var_typeName, + id: var_id, + name: var_name, + externalUri: var_externalUri, + images: var_images); + } + + @protected + SpotubeSimplePlaylistObject sse_decode_spotube_simple_playlist_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_description = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_owner = sse_decode_spotube_user_object(deserializer); + var var_images = sse_decode_list_spotube_image_object(deserializer); + return SpotubeSimplePlaylistObject( + typeName: var_typeName, + id: var_id, + name: var_name, + description: var_description, + externalUri: var_externalUri, + owner: var_owner, + images: var_images); + } + + @protected + SpotubeTrackObject sse_decode_spotube_track_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_externalUri = sse_decode_String(deserializer); + var var_artists = + sse_decode_list_spotube_simple_artist_object(deserializer); + var var_album = sse_decode_spotube_simple_album_object(deserializer); + var var_durationMs = sse_decode_u_64(deserializer); + var var_isrc = sse_decode_String(deserializer); + var var_explicit = sse_decode_bool(deserializer); + return SpotubeTrackObject( + typeName: var_typeName, + id: var_id, + name: var_name, + externalUri: var_externalUri, + artists: var_artists, + album: var_album, + durationMs: var_durationMs, + isrc: var_isrc, + explicit: var_explicit); + } + + @protected + SpotubeUserObject sse_decode_spotube_user_object( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_typeName = sse_decode_String(deserializer); + var var_id = sse_decode_String(deserializer); + var var_name = sse_decode_String(deserializer); + var var_images = sse_decode_list_spotube_image_object(deserializer); + var var_externalUri = sse_decode_String(deserializer); + return SpotubeUserObject( + typeName: var_typeName, + id: var_id, + name: var_name, + images: var_images, + externalUri: var_externalUri); + } + + @protected + int sse_decode_u_32(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getUint32(); + } + + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getBigUint64(); + } + @protected int sse_decode_u_8(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -190,15 +4724,96 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - int sse_decode_i_32(SseDeserializer deserializer) { + BigInt sse_decode_usize(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getInt32(); + return deserializer.buffer.getBigUint64(); } @protected - bool sse_decode_bool(SseDeserializer deserializer) { + void sse_encode_AnyhowException( + AnyhowException self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - return deserializer.buffer.getUint8() != 0; + sse_encode_String(self.message, serializer); + } + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as OpaqueSenderImpl).frbInternalSseEncode(move: true), + serializer); + } + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + PluginCommand self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as PluginCommandImpl).frbInternalSseEncode(move: true), + serializer); + } + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SenderPluginCommand self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as SenderPluginCommandImpl).frbInternalSseEncode(move: true), + serializer); + } + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as OpaqueSenderImpl).frbInternalSseEncode(move: false), + serializer); + } + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as OpaqueSenderImpl).frbInternalSseEncode(move: false), + serializer); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as OpaqueSenderImpl).frbInternalSseEncode(move: null), + serializer); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + PluginCommand self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as PluginCommandImpl).frbInternalSseEncode(move: null), + serializer); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SenderPluginCommand self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as SenderPluginCommandImpl).frbInternalSseEncode(move: null), + serializer); } @protected @@ -207,6 +4822,272 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_list_prim_u_8_strict(utf8.encoder.convert(self), serializer); } + @protected + void sse_encode_bool(bool self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putUint8(self ? 1 : 0); + } + + @protected + void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_bool(self, serializer); + } + + @protected + void sse_encode_box_autoadd_f_64(double self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_f_64(self, serializer); + } + + @protected + void sse_encode_box_autoadd_i_32(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self, serializer); + } + + @protected + void sse_encode_box_autoadd_i_64( + PlatformInt64 self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_64(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_album_sender( + PluginAlbumSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_album_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_artist_sender( + PluginArtistSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_artist_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_audio_source_sender( + PluginAudioSourceSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_audio_source_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_auth_sender( + PluginAuthSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_auth_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_browse_sender( + PluginBrowseSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_browse_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_configuration( + PluginConfiguration self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_configuration(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_core_sender( + PluginCoreSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_core_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_playlist_sender( + PluginPlaylistSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_playlist_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_search_sender( + PluginSearchSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_search_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_track_sender( + PluginTrackSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_track_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_update_available( + PluginUpdateAvailable self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_update_available(self, serializer); + } + + @protected + void sse_encode_box_autoadd_plugin_user_sender( + PluginUserSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_user_sender(self, serializer); + } + + @protected + void sse_encode_box_autoadd_scrobble_details( + ScrobbleDetails self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_scrobble_details(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_audio_lossless_container_quality( + SpotubeAudioLosslessContainerQuality self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_audio_lossless_container_quality(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_audio_lossy_container_quality( + SpotubeAudioLossyContainerQuality self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_audio_lossy_container_quality(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_audio_source_container_preset( + SpotubeAudioSourceContainerPreset self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_audio_source_container_preset(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_audio_source_match_object( + SpotubeAudioSourceMatchObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_audio_source_match_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_browse_section_object( + SpotubeBrowseSectionObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_browse_section_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_full_album_object( + SpotubeFullAlbumObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_full_album_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_full_artist_object( + SpotubeFullArtistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_full_artist_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_full_playlist_object( + SpotubeFullPlaylistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_full_playlist_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_plugin( + SpotubePlugin self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_plugin(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_simple_album_object( + SpotubeSimpleAlbumObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_simple_album_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_simple_artist_object( + SpotubeSimpleArtistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_simple_artist_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_simple_playlist_object( + SpotubeSimplePlaylistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_simple_playlist_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_spotube_track_object( + SpotubeTrackObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_spotube_track_object(self, serializer); + } + + @protected + void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_u_32(self, serializer); + } + + @protected + void sse_encode_f_64(double self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putFloat64(self); + } + + @protected + void sse_encode_i_32(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putInt32(self); + } + + @protected + void sse_encode_i_64(PlatformInt64 self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putPlatformInt64(self); + } + + @protected + void sse_encode_list_String(List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_String(item, serializer); + } + } + + @protected + void sse_encode_list_plugin_ability( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_plugin_ability(item, serializer); + } + } + + @protected + void sse_encode_list_plugin_api( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_plugin_api(item, serializer); + } + } + @protected void sse_encode_list_prim_u_8_strict( Uint8List self, SseSerializer serializer) { @@ -215,6 +5096,731 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putUint8List(self); } + @protected + void sse_encode_list_scrobble_artist( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_scrobble_artist(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_audio_lossless_container_quality( + List self, + SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_audio_lossless_container_quality(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_audio_lossy_container_quality( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_audio_lossy_container_quality(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_audio_source_match_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_audio_source_match_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_audio_source_stream_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_audio_source_stream_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_browse_section_response_object_item( + List self, + SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_browse_section_response_object_item(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_full_artist_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_full_artist_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_image_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_image_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_pagination_response_object_item( + List self, + SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_pagination_response_object_item(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_simple_album_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_simple_album_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_simple_artist_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_simple_artist_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_simple_playlist_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_simple_playlist_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_track_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_track_object(item, serializer); + } + } + + @protected + void sse_encode_list_spotube_user_object( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_spotube_user_object(item, serializer); + } + } + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_String(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_bool(bool? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_bool(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_f_64(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_i_32(int? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_i_32(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_i_64( + PlatformInt64? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_i_64(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_plugin_update_available( + PluginUpdateAvailable? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_plugin_update_available(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_spotube_full_playlist_object( + SpotubeFullPlaylistObject? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_spotube_full_playlist_object(self, serializer); + } + } + + @protected + void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_u_32(self, serializer); + } + } + + @protected + void sse_encode_opt_list_String( + List? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_list_String(self, serializer); + } + } + + @protected + void sse_encode_opt_list_spotube_image_object( + List? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_list_spotube_image_object(self, serializer); + } + } + + @protected + void sse_encode_plugin_ability(PluginAbility self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_plugin_album_sender( + PluginAlbumSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_api(PluginApi self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_plugin_artist_sender( + PluginArtistSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_audio_source_sender( + PluginAudioSourceSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_auth_sender( + PluginAuthSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_browse_sender( + PluginBrowseSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_configuration( + PluginConfiguration self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.name, serializer); + sse_encode_String(self.description, serializer); + sse_encode_String(self.version, serializer); + sse_encode_String(self.author, serializer); + sse_encode_String(self.entryPoint, serializer); + sse_encode_String(self.pluginApiVersion, serializer); + sse_encode_list_plugin_api(self.apis, serializer); + sse_encode_list_plugin_ability(self.abilities, serializer); + sse_encode_opt_String(self.repository, serializer); + } + + @protected + void sse_encode_plugin_core_sender( + PluginCoreSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_playlist_sender( + PluginPlaylistSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_search_sender( + PluginSearchSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_track_sender( + PluginTrackSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_plugin_update_available( + PluginUpdateAvailable self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.downloadUrl, serializer); + sse_encode_String(self.version, serializer); + sse_encode_opt_String(self.changelog, serializer); + } + + @protected + void sse_encode_plugin_user_sender( + PluginUserSender self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + } + + @protected + void sse_encode_scrobble_album(ScrobbleAlbum self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + } + + @protected + void sse_encode_scrobble_artist( + ScrobbleArtist self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + } + + @protected + void sse_encode_scrobble_details( + ScrobbleDetails self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.id, serializer); + sse_encode_String(self.title, serializer); + sse_encode_list_scrobble_artist(self.artists, serializer); + sse_encode_scrobble_album(self.album, serializer); + sse_encode_opt_box_autoadd_i_64(self.timestamp, serializer); + sse_encode_opt_box_autoadd_u_32(self.durationMs, serializer); + sse_encode_opt_String(self.isrc, serializer); + } + + @protected + void sse_encode_spotube_album_type( + SpotubeAlbumType self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_spotube_audio_lossless_container_quality( + SpotubeAudioLosslessContainerQuality self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.bitDepth, serializer); + sse_encode_i_32(self.sampleRate, serializer); + } + + @protected + void sse_encode_spotube_audio_lossy_container_quality( + SpotubeAudioLossyContainerQuality self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.bitrate, serializer); + } + + @protected + void sse_encode_spotube_audio_source_container_preset( + SpotubeAudioSourceContainerPreset self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case SpotubeAudioSourceContainerPreset_Lossy( + compressionType: final compressionType, + name: final name, + qualities: final qualities + ): + sse_encode_i_32(0, serializer); + sse_encode_spotube_media_compression_type(compressionType, serializer); + sse_encode_String(name, serializer); + sse_encode_list_spotube_audio_lossy_container_quality( + qualities, serializer); + case SpotubeAudioSourceContainerPreset_Lossless( + compressionType: final compressionType, + name: final name, + qualities: final qualities + ): + sse_encode_i_32(1, serializer); + sse_encode_spotube_media_compression_type(compressionType, serializer); + sse_encode_String(name, serializer); + sse_encode_list_spotube_audio_lossless_container_quality( + qualities, serializer); + } + } + + @protected + void sse_encode_spotube_audio_source_match_object( + SpotubeAudioSourceMatchObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.title, serializer); + sse_encode_list_String(self.artists, serializer); + sse_encode_u_64(self.duration, serializer); + sse_encode_opt_String(self.thumbnail, serializer); + sse_encode_String(self.externalUri, serializer); + } + + @protected + void sse_encode_spotube_audio_source_stream_object( + SpotubeAudioSourceStreamObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.url, serializer); + sse_encode_String(self.container, serializer); + sse_encode_spotube_media_compression_type(self.compressionType, serializer); + sse_encode_opt_String(self.codec, serializer); + sse_encode_opt_box_autoadd_f_64(self.bitrate, serializer); + sse_encode_opt_box_autoadd_i_32(self.bitDepth, serializer); + sse_encode_opt_box_autoadd_f_64(self.sampleRate, serializer); + } + + @protected + void sse_encode_spotube_browse_section_object( + SpotubeBrowseSectionObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.title, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_bool(self.browseMore, serializer); + sse_encode_list_spotube_browse_section_response_object_item( + self.items, serializer); + } + + @protected + void sse_encode_spotube_browse_section_response_object_item( + SpotubeBrowseSectionResponseObjectItem self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case SpotubeBrowseSectionResponseObjectItem_Track(field0: final field0): + sse_encode_i_32(0, serializer); + sse_encode_box_autoadd_spotube_track_object(field0, serializer); + case SpotubeBrowseSectionResponseObjectItem_PlaylistFull( + field0: final field0 + ): + sse_encode_i_32(1, serializer); + sse_encode_box_autoadd_spotube_full_playlist_object(field0, serializer); + case SpotubeBrowseSectionResponseObjectItem_PlaylistSimple( + field0: final field0 + ): + sse_encode_i_32(2, serializer); + sse_encode_box_autoadd_spotube_simple_playlist_object( + field0, serializer); + case SpotubeBrowseSectionResponseObjectItem_AlbumSimple( + field0: final field0 + ): + sse_encode_i_32(3, serializer); + sse_encode_box_autoadd_spotube_simple_album_object(field0, serializer); + case SpotubeBrowseSectionResponseObjectItem_AlbumFull( + field0: final field0 + ): + sse_encode_i_32(4, serializer); + sse_encode_box_autoadd_spotube_full_album_object(field0, serializer); + case SpotubeBrowseSectionResponseObjectItem_ArtistFull( + field0: final field0 + ): + sse_encode_i_32(5, serializer); + sse_encode_box_autoadd_spotube_full_artist_object(field0, serializer); + case SpotubeBrowseSectionResponseObjectItem_ArtistSimple( + field0: final field0 + ): + sse_encode_i_32(6, serializer); + sse_encode_box_autoadd_spotube_simple_artist_object(field0, serializer); + } + } + + @protected + void sse_encode_spotube_full_album_object( + SpotubeFullAlbumObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_list_spotube_simple_artist_object(self.artists, serializer); + sse_encode_list_spotube_image_object(self.images, serializer); + sse_encode_String(self.releaseDate, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_i_32(self.totalTracks, serializer); + sse_encode_spotube_album_type(self.albumType, serializer); + sse_encode_opt_String(self.recordLabel, serializer); + sse_encode_opt_list_String(self.genres, serializer); + } + + @protected + void sse_encode_spotube_full_artist_object( + SpotubeFullArtistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_list_spotube_image_object(self.images, serializer); + sse_encode_opt_list_String(self.genres, serializer); + sse_encode_opt_box_autoadd_i_32(self.followers, serializer); + } + + @protected + void sse_encode_spotube_full_playlist_object( + SpotubeFullPlaylistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.description, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_spotube_user_object(self.owner, serializer); + sse_encode_list_spotube_image_object(self.images, serializer); + sse_encode_list_spotube_user_object(self.collaborators, serializer); + sse_encode_bool(self.collaborative, serializer); + sse_encode_bool(self.public, serializer); + } + + @protected + void sse_encode_spotube_image_object( + SpotubeImageObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.url, serializer); + sse_encode_opt_box_autoadd_i_32(self.width, serializer); + sse_encode_opt_box_autoadd_i_32(self.height, serializer); + } + + @protected + void sse_encode_spotube_media_compression_type( + SpotubeMediaCompressionType self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.index, serializer); + } + + @protected + void sse_encode_spotube_pagination_response_object( + SpotubePaginationResponseObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.limit, serializer); + sse_encode_opt_box_autoadd_i_32(self.nextOffset, serializer); + sse_encode_i_32(self.total, serializer); + sse_encode_bool(self.hasMore, serializer); + sse_encode_list_spotube_pagination_response_object_item( + self.items, serializer); + } + + @protected + void sse_encode_spotube_pagination_response_object_item( + SpotubePaginationResponseObjectItem self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case SpotubePaginationResponseObjectItem_Track(field0: final field0): + sse_encode_i_32(0, serializer); + sse_encode_box_autoadd_spotube_track_object(field0, serializer); + case SpotubePaginationResponseObjectItem_PlaylistFull( + field0: final field0 + ): + sse_encode_i_32(1, serializer); + sse_encode_box_autoadd_spotube_full_playlist_object(field0, serializer); + case SpotubePaginationResponseObjectItem_PlaylistSimple( + field0: final field0 + ): + sse_encode_i_32(2, serializer); + sse_encode_box_autoadd_spotube_simple_playlist_object( + field0, serializer); + case SpotubePaginationResponseObjectItem_AlbumSimple( + field0: final field0 + ): + sse_encode_i_32(3, serializer); + sse_encode_box_autoadd_spotube_simple_album_object(field0, serializer); + case SpotubePaginationResponseObjectItem_AlbumFull(field0: final field0): + sse_encode_i_32(4, serializer); + sse_encode_box_autoadd_spotube_full_album_object(field0, serializer); + case SpotubePaginationResponseObjectItem_ArtistFull(field0: final field0): + sse_encode_i_32(5, serializer); + sse_encode_box_autoadd_spotube_full_artist_object(field0, serializer); + case SpotubePaginationResponseObjectItem_ArtistSimple( + field0: final field0 + ): + sse_encode_i_32(6, serializer); + sse_encode_box_autoadd_spotube_simple_artist_object(field0, serializer); + case SpotubePaginationResponseObjectItem_BrowseSection( + field0: final field0 + ): + sse_encode_i_32(7, serializer); + sse_encode_box_autoadd_spotube_browse_section_object( + field0, serializer); + } + } + + @protected + void sse_encode_spotube_plugin(SpotubePlugin self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_plugin_artist_sender(self.artist, serializer); + sse_encode_plugin_album_sender(self.album, serializer); + sse_encode_plugin_audio_source_sender(self.audioSource, serializer); + sse_encode_plugin_auth_sender(self.auth, serializer); + sse_encode_plugin_browse_sender(self.browse, serializer); + sse_encode_plugin_core_sender(self.core, serializer); + sse_encode_plugin_playlist_sender(self.playlist, serializer); + sse_encode_plugin_search_sender(self.search, serializer); + sse_encode_plugin_track_sender(self.track, serializer); + sse_encode_plugin_user_sender(self.user, serializer); + } + + @protected + void sse_encode_spotube_search_response_object( + SpotubeSearchResponseObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_list_spotube_simple_album_object(self.albums, serializer); + sse_encode_list_spotube_full_artist_object(self.artists, serializer); + sse_encode_list_spotube_simple_playlist_object(self.playlists, serializer); + sse_encode_list_spotube_track_object(self.tracks, serializer); + } + + @protected + void sse_encode_spotube_simple_album_object( + SpotubeSimpleAlbumObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_list_spotube_simple_artist_object(self.artists, serializer); + sse_encode_list_spotube_image_object(self.images, serializer); + sse_encode_spotube_album_type(self.albumType, serializer); + sse_encode_opt_String(self.releaseDate, serializer); + } + + @protected + void sse_encode_spotube_simple_artist_object( + SpotubeSimpleArtistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_opt_list_spotube_image_object(self.images, serializer); + } + + @protected + void sse_encode_spotube_simple_playlist_object( + SpotubeSimplePlaylistObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.description, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_spotube_user_object(self.owner, serializer); + sse_encode_list_spotube_image_object(self.images, serializer); + } + + @protected + void sse_encode_spotube_track_object( + SpotubeTrackObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_String(self.externalUri, serializer); + sse_encode_list_spotube_simple_artist_object(self.artists, serializer); + sse_encode_spotube_simple_album_object(self.album, serializer); + sse_encode_u_64(self.durationMs, serializer); + sse_encode_String(self.isrc, serializer); + sse_encode_bool(self.explicit, serializer); + } + + @protected + void sse_encode_spotube_user_object( + SpotubeUserObject self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.typeName, serializer); + sse_encode_String(self.id, serializer); + sse_encode_String(self.name, serializer); + sse_encode_list_spotube_image_object(self.images, serializer); + sse_encode_String(self.externalUri, serializer); + } + + @protected + void sse_encode_u_32(int self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putUint32(self); + } + + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putBigUint64(self); + } + @protected void sse_encode_u_8(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -227,14 +5833,79 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } @protected - void sse_encode_i_32(int self, SseSerializer serializer) { + void sse_encode_usize(BigInt self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs - serializer.buffer.putInt32(self); - } - - @protected - void sse_encode_bool(bool self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - serializer.buffer.putUint8(self ? 1 : 0); + serializer.buffer.putBigUint64(self); } } + +@sealed +class OpaqueSenderImpl extends RustOpaque implements OpaqueSender { + // Not to be used by end users + OpaqueSenderImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + OpaqueSenderImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: + RustLib.instance.api.rust_arc_increment_strong_count_OpaqueSender, + rustArcDecrementStrongCount: + RustLib.instance.api.rust_arc_decrement_strong_count_OpaqueSender, + rustArcDecrementStrongCountPtr: + RustLib.instance.api.rust_arc_decrement_strong_count_OpaqueSenderPtr, + ); + + SenderPluginCommand get sender => RustLib.instance.api + .crateApiPluginPluginOpaqueSenderAutoAccessorGetSender( + that: this, + ); + + set sender(SenderPluginCommand sender) => RustLib.instance.api + .crateApiPluginPluginOpaqueSenderAutoAccessorSetSender( + that: this, sender: sender); +} + +@sealed +class PluginCommandImpl extends RustOpaque implements PluginCommand { + // Not to be used by end users + PluginCommandImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + PluginCommandImpl.frbInternalSseDecode(BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: + RustLib.instance.api.rust_arc_increment_strong_count_PluginCommand, + rustArcDecrementStrongCount: + RustLib.instance.api.rust_arc_decrement_strong_count_PluginCommand, + rustArcDecrementStrongCountPtr: + RustLib.instance.api.rust_arc_decrement_strong_count_PluginCommandPtr, + ); +} + +@sealed +class SenderPluginCommandImpl extends RustOpaque + implements SenderPluginCommand { + // Not to be used by end users + SenderPluginCommandImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + SenderPluginCommandImpl.frbInternalSseDecode( + BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib + .instance.api.rust_arc_increment_strong_count_SenderPluginCommand, + rustArcDecrementStrongCount: RustLib + .instance.api.rust_arc_decrement_strong_count_SenderPluginCommand, + rustArcDecrementStrongCountPtr: RustLib + .instance.api.rust_arc_decrement_strong_count_SenderPluginCommandPtr, + ); +} diff --git a/lib/src/rust/frb_generated.io.dart b/lib/src/rust/frb_generated.io.dart index 2af216f7..b9895671 100644 --- a/lib/src/rust/frb_generated.io.dart +++ b/lib/src/rust/frb_generated.io.dart @@ -3,7 +3,20 @@ // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field -import 'api/simple.dart'; +import 'api/plugin/commands.dart'; +import 'api/plugin/models/album.dart'; +import 'api/plugin/models/artist.dart'; +import 'api/plugin/models/audio_source.dart'; +import 'api/plugin/models/browse.dart'; +import 'api/plugin/models/core.dart'; +import 'api/plugin/models/image.dart'; +import 'api/plugin/models/pagination.dart'; +import 'api/plugin/models/playlist.dart'; +import 'api/plugin/models/search.dart'; +import 'api/plugin/models/track.dart'; +import 'api/plugin/models/user.dart'; +import 'api/plugin/plugin.dart'; +import 'api/plugin/senders.dart'; import 'dart:async'; import 'dart:convert'; import 'dart:ffi' as ffi; @@ -18,24 +31,877 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { required super.portManager, }); + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_OpaqueSenderPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSenderPtr; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_PluginCommandPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommandPtr; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_SenderPluginCommandPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommandPtr; + + @protected + AnyhowException dco_decode_AnyhowException(dynamic raw); + + @protected + OpaqueSender + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw); + + @protected + PluginCommand + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + dynamic raw); + + @protected + SenderPluginCommand + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + dynamic raw); + + @protected + OpaqueSender + dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw); + + @protected + OpaqueSender + dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw); + + @protected + OpaqueSender + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + dynamic raw); + + @protected + PluginCommand + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + dynamic raw); + + @protected + SenderPluginCommand + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + dynamic raw); + @protected String dco_decode_String(dynamic raw); + @protected + bool dco_decode_bool(dynamic raw); + + @protected + bool dco_decode_box_autoadd_bool(dynamic raw); + + @protected + double dco_decode_box_autoadd_f_64(dynamic raw); + + @protected + int dco_decode_box_autoadd_i_32(dynamic raw); + + @protected + PlatformInt64 dco_decode_box_autoadd_i_64(dynamic raw); + + @protected + PluginAlbumSender dco_decode_box_autoadd_plugin_album_sender(dynamic raw); + + @protected + PluginArtistSender dco_decode_box_autoadd_plugin_artist_sender(dynamic raw); + + @protected + PluginAudioSourceSender dco_decode_box_autoadd_plugin_audio_source_sender( + dynamic raw); + + @protected + PluginAuthSender dco_decode_box_autoadd_plugin_auth_sender(dynamic raw); + + @protected + PluginBrowseSender dco_decode_box_autoadd_plugin_browse_sender(dynamic raw); + + @protected + PluginConfiguration dco_decode_box_autoadd_plugin_configuration(dynamic raw); + + @protected + PluginCoreSender dco_decode_box_autoadd_plugin_core_sender(dynamic raw); + + @protected + PluginPlaylistSender dco_decode_box_autoadd_plugin_playlist_sender( + dynamic raw); + + @protected + PluginSearchSender dco_decode_box_autoadd_plugin_search_sender(dynamic raw); + + @protected + PluginTrackSender dco_decode_box_autoadd_plugin_track_sender(dynamic raw); + + @protected + PluginUpdateAvailable dco_decode_box_autoadd_plugin_update_available( + dynamic raw); + + @protected + PluginUserSender dco_decode_box_autoadd_plugin_user_sender(dynamic raw); + + @protected + ScrobbleDetails dco_decode_box_autoadd_scrobble_details(dynamic raw); + + @protected + SpotubeAudioLosslessContainerQuality + dco_decode_box_autoadd_spotube_audio_lossless_container_quality( + dynamic raw); + + @protected + SpotubeAudioLossyContainerQuality + dco_decode_box_autoadd_spotube_audio_lossy_container_quality(dynamic raw); + + @protected + SpotubeAudioSourceContainerPreset + dco_decode_box_autoadd_spotube_audio_source_container_preset(dynamic raw); + + @protected + SpotubeAudioSourceMatchObject + dco_decode_box_autoadd_spotube_audio_source_match_object(dynamic raw); + + @protected + SpotubeBrowseSectionObject + dco_decode_box_autoadd_spotube_browse_section_object(dynamic raw); + + @protected + SpotubeFullAlbumObject dco_decode_box_autoadd_spotube_full_album_object( + dynamic raw); + + @protected + SpotubeFullArtistObject dco_decode_box_autoadd_spotube_full_artist_object( + dynamic raw); + + @protected + SpotubeFullPlaylistObject dco_decode_box_autoadd_spotube_full_playlist_object( + dynamic raw); + + @protected + SpotubePlugin dco_decode_box_autoadd_spotube_plugin(dynamic raw); + + @protected + SpotubeSimpleAlbumObject dco_decode_box_autoadd_spotube_simple_album_object( + dynamic raw); + + @protected + SpotubeSimpleArtistObject dco_decode_box_autoadd_spotube_simple_artist_object( + dynamic raw); + + @protected + SpotubeSimplePlaylistObject + dco_decode_box_autoadd_spotube_simple_playlist_object(dynamic raw); + + @protected + SpotubeTrackObject dco_decode_box_autoadd_spotube_track_object(dynamic raw); + + @protected + int dco_decode_box_autoadd_u_32(dynamic raw); + + @protected + double dco_decode_f_64(dynamic raw); + + @protected + int dco_decode_i_32(dynamic raw); + + @protected + PlatformInt64 dco_decode_i_64(dynamic raw); + + @protected + List dco_decode_list_String(dynamic raw); + + @protected + List dco_decode_list_plugin_ability(dynamic raw); + + @protected + List dco_decode_list_plugin_api(dynamic raw); + @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); + @protected + List dco_decode_list_scrobble_artist(dynamic raw); + + @protected + List + dco_decode_list_spotube_audio_lossless_container_quality(dynamic raw); + + @protected + List + dco_decode_list_spotube_audio_lossy_container_quality(dynamic raw); + + @protected + List + dco_decode_list_spotube_audio_source_match_object(dynamic raw); + + @protected + List + dco_decode_list_spotube_audio_source_stream_object(dynamic raw); + + @protected + List + dco_decode_list_spotube_browse_section_response_object_item(dynamic raw); + + @protected + List dco_decode_list_spotube_full_artist_object( + dynamic raw); + + @protected + List dco_decode_list_spotube_image_object(dynamic raw); + + @protected + List + dco_decode_list_spotube_pagination_response_object_item(dynamic raw); + + @protected + List dco_decode_list_spotube_simple_album_object( + dynamic raw); + + @protected + List dco_decode_list_spotube_simple_artist_object( + dynamic raw); + + @protected + List + dco_decode_list_spotube_simple_playlist_object(dynamic raw); + + @protected + List dco_decode_list_spotube_track_object(dynamic raw); + + @protected + List dco_decode_list_spotube_user_object(dynamic raw); + + @protected + String? dco_decode_opt_String(dynamic raw); + + @protected + bool? dco_decode_opt_box_autoadd_bool(dynamic raw); + + @protected + double? dco_decode_opt_box_autoadd_f_64(dynamic raw); + + @protected + int? dco_decode_opt_box_autoadd_i_32(dynamic raw); + + @protected + PlatformInt64? dco_decode_opt_box_autoadd_i_64(dynamic raw); + + @protected + PluginUpdateAvailable? dco_decode_opt_box_autoadd_plugin_update_available( + dynamic raw); + + @protected + SpotubeFullPlaylistObject? + dco_decode_opt_box_autoadd_spotube_full_playlist_object(dynamic raw); + + @protected + int? dco_decode_opt_box_autoadd_u_32(dynamic raw); + + @protected + List? dco_decode_opt_list_String(dynamic raw); + + @protected + List? dco_decode_opt_list_spotube_image_object( + dynamic raw); + + @protected + PluginAbility dco_decode_plugin_ability(dynamic raw); + + @protected + PluginAlbumSender dco_decode_plugin_album_sender(dynamic raw); + + @protected + PluginApi dco_decode_plugin_api(dynamic raw); + + @protected + PluginArtistSender dco_decode_plugin_artist_sender(dynamic raw); + + @protected + PluginAudioSourceSender dco_decode_plugin_audio_source_sender(dynamic raw); + + @protected + PluginAuthSender dco_decode_plugin_auth_sender(dynamic raw); + + @protected + PluginBrowseSender dco_decode_plugin_browse_sender(dynamic raw); + + @protected + PluginConfiguration dco_decode_plugin_configuration(dynamic raw); + + @protected + PluginCoreSender dco_decode_plugin_core_sender(dynamic raw); + + @protected + PluginPlaylistSender dco_decode_plugin_playlist_sender(dynamic raw); + + @protected + PluginSearchSender dco_decode_plugin_search_sender(dynamic raw); + + @protected + PluginTrackSender dco_decode_plugin_track_sender(dynamic raw); + + @protected + PluginUpdateAvailable dco_decode_plugin_update_available(dynamic raw); + + @protected + PluginUserSender dco_decode_plugin_user_sender(dynamic raw); + + @protected + ScrobbleAlbum dco_decode_scrobble_album(dynamic raw); + + @protected + ScrobbleArtist dco_decode_scrobble_artist(dynamic raw); + + @protected + ScrobbleDetails dco_decode_scrobble_details(dynamic raw); + + @protected + SpotubeAlbumType dco_decode_spotube_album_type(dynamic raw); + + @protected + SpotubeAudioLosslessContainerQuality + dco_decode_spotube_audio_lossless_container_quality(dynamic raw); + + @protected + SpotubeAudioLossyContainerQuality + dco_decode_spotube_audio_lossy_container_quality(dynamic raw); + + @protected + SpotubeAudioSourceContainerPreset + dco_decode_spotube_audio_source_container_preset(dynamic raw); + + @protected + SpotubeAudioSourceMatchObject dco_decode_spotube_audio_source_match_object( + dynamic raw); + + @protected + SpotubeAudioSourceStreamObject dco_decode_spotube_audio_source_stream_object( + dynamic raw); + + @protected + SpotubeBrowseSectionObject dco_decode_spotube_browse_section_object( + dynamic raw); + + @protected + SpotubeBrowseSectionResponseObjectItem + dco_decode_spotube_browse_section_response_object_item(dynamic raw); + + @protected + SpotubeFullAlbumObject dco_decode_spotube_full_album_object(dynamic raw); + + @protected + SpotubeFullArtistObject dco_decode_spotube_full_artist_object(dynamic raw); + + @protected + SpotubeFullPlaylistObject dco_decode_spotube_full_playlist_object( + dynamic raw); + + @protected + SpotubeImageObject dco_decode_spotube_image_object(dynamic raw); + + @protected + SpotubeMediaCompressionType dco_decode_spotube_media_compression_type( + dynamic raw); + + @protected + SpotubePaginationResponseObject dco_decode_spotube_pagination_response_object( + dynamic raw); + + @protected + SpotubePaginationResponseObjectItem + dco_decode_spotube_pagination_response_object_item(dynamic raw); + + @protected + SpotubePlugin dco_decode_spotube_plugin(dynamic raw); + + @protected + SpotubeSearchResponseObject dco_decode_spotube_search_response_object( + dynamic raw); + + @protected + SpotubeSimpleAlbumObject dco_decode_spotube_simple_album_object(dynamic raw); + + @protected + SpotubeSimpleArtistObject dco_decode_spotube_simple_artist_object( + dynamic raw); + + @protected + SpotubeSimplePlaylistObject dco_decode_spotube_simple_playlist_object( + dynamic raw); + + @protected + SpotubeTrackObject dco_decode_spotube_track_object(dynamic raw); + + @protected + SpotubeUserObject dco_decode_spotube_user_object(dynamic raw); + + @protected + int dco_decode_u_32(dynamic raw); + + @protected + BigInt dco_decode_u_64(dynamic raw); + @protected int dco_decode_u_8(dynamic raw); @protected void dco_decode_unit(dynamic raw); + @protected + BigInt dco_decode_usize(dynamic raw); + + @protected + AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer); + + @protected + OpaqueSender + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer); + + @protected + PluginCommand + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + SseDeserializer deserializer); + + @protected + SenderPluginCommand + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SseDeserializer deserializer); + + @protected + OpaqueSender + sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer); + + @protected + OpaqueSender + sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer); + + @protected + OpaqueSender + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + SseDeserializer deserializer); + + @protected + PluginCommand + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + SseDeserializer deserializer); + + @protected + SenderPluginCommand + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SseDeserializer deserializer); + @protected String sse_decode_String(SseDeserializer deserializer); + @protected + bool sse_decode_bool(SseDeserializer deserializer); + + @protected + bool sse_decode_box_autoadd_bool(SseDeserializer deserializer); + + @protected + double sse_decode_box_autoadd_f_64(SseDeserializer deserializer); + + @protected + int sse_decode_box_autoadd_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64 sse_decode_box_autoadd_i_64(SseDeserializer deserializer); + + @protected + PluginAlbumSender sse_decode_box_autoadd_plugin_album_sender( + SseDeserializer deserializer); + + @protected + PluginArtistSender sse_decode_box_autoadd_plugin_artist_sender( + SseDeserializer deserializer); + + @protected + PluginAudioSourceSender sse_decode_box_autoadd_plugin_audio_source_sender( + SseDeserializer deserializer); + + @protected + PluginAuthSender sse_decode_box_autoadd_plugin_auth_sender( + SseDeserializer deserializer); + + @protected + PluginBrowseSender sse_decode_box_autoadd_plugin_browse_sender( + SseDeserializer deserializer); + + @protected + PluginConfiguration sse_decode_box_autoadd_plugin_configuration( + SseDeserializer deserializer); + + @protected + PluginCoreSender sse_decode_box_autoadd_plugin_core_sender( + SseDeserializer deserializer); + + @protected + PluginPlaylistSender sse_decode_box_autoadd_plugin_playlist_sender( + SseDeserializer deserializer); + + @protected + PluginSearchSender sse_decode_box_autoadd_plugin_search_sender( + SseDeserializer deserializer); + + @protected + PluginTrackSender sse_decode_box_autoadd_plugin_track_sender( + SseDeserializer deserializer); + + @protected + PluginUpdateAvailable sse_decode_box_autoadd_plugin_update_available( + SseDeserializer deserializer); + + @protected + PluginUserSender sse_decode_box_autoadd_plugin_user_sender( + SseDeserializer deserializer); + + @protected + ScrobbleDetails sse_decode_box_autoadd_scrobble_details( + SseDeserializer deserializer); + + @protected + SpotubeAudioLosslessContainerQuality + sse_decode_box_autoadd_spotube_audio_lossless_container_quality( + SseDeserializer deserializer); + + @protected + SpotubeAudioLossyContainerQuality + sse_decode_box_autoadd_spotube_audio_lossy_container_quality( + SseDeserializer deserializer); + + @protected + SpotubeAudioSourceContainerPreset + sse_decode_box_autoadd_spotube_audio_source_container_preset( + SseDeserializer deserializer); + + @protected + SpotubeAudioSourceMatchObject + sse_decode_box_autoadd_spotube_audio_source_match_object( + SseDeserializer deserializer); + + @protected + SpotubeBrowseSectionObject + sse_decode_box_autoadd_spotube_browse_section_object( + SseDeserializer deserializer); + + @protected + SpotubeFullAlbumObject sse_decode_box_autoadd_spotube_full_album_object( + SseDeserializer deserializer); + + @protected + SpotubeFullArtistObject sse_decode_box_autoadd_spotube_full_artist_object( + SseDeserializer deserializer); + + @protected + SpotubeFullPlaylistObject sse_decode_box_autoadd_spotube_full_playlist_object( + SseDeserializer deserializer); + + @protected + SpotubePlugin sse_decode_box_autoadd_spotube_plugin( + SseDeserializer deserializer); + + @protected + SpotubeSimpleAlbumObject sse_decode_box_autoadd_spotube_simple_album_object( + SseDeserializer deserializer); + + @protected + SpotubeSimpleArtistObject sse_decode_box_autoadd_spotube_simple_artist_object( + SseDeserializer deserializer); + + @protected + SpotubeSimplePlaylistObject + sse_decode_box_autoadd_spotube_simple_playlist_object( + SseDeserializer deserializer); + + @protected + SpotubeTrackObject sse_decode_box_autoadd_spotube_track_object( + SseDeserializer deserializer); + + @protected + int sse_decode_box_autoadd_u_32(SseDeserializer deserializer); + + @protected + double sse_decode_f_64(SseDeserializer deserializer); + + @protected + int sse_decode_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64 sse_decode_i_64(SseDeserializer deserializer); + + @protected + List sse_decode_list_String(SseDeserializer deserializer); + + @protected + List sse_decode_list_plugin_ability( + SseDeserializer deserializer); + + @protected + List sse_decode_list_plugin_api(SseDeserializer deserializer); + @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); + @protected + List sse_decode_list_scrobble_artist( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_audio_lossless_container_quality( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_audio_lossy_container_quality( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_audio_source_match_object( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_audio_source_stream_object( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_browse_section_response_object_item( + SseDeserializer deserializer); + + @protected + List sse_decode_list_spotube_full_artist_object( + SseDeserializer deserializer); + + @protected + List sse_decode_list_spotube_image_object( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_pagination_response_object_item( + SseDeserializer deserializer); + + @protected + List sse_decode_list_spotube_simple_album_object( + SseDeserializer deserializer); + + @protected + List sse_decode_list_spotube_simple_artist_object( + SseDeserializer deserializer); + + @protected + List + sse_decode_list_spotube_simple_playlist_object( + SseDeserializer deserializer); + + @protected + List sse_decode_list_spotube_track_object( + SseDeserializer deserializer); + + @protected + List sse_decode_list_spotube_user_object( + SseDeserializer deserializer); + + @protected + String? sse_decode_opt_String(SseDeserializer deserializer); + + @protected + bool? sse_decode_opt_box_autoadd_bool(SseDeserializer deserializer); + + @protected + double? sse_decode_opt_box_autoadd_f_64(SseDeserializer deserializer); + + @protected + int? sse_decode_opt_box_autoadd_i_32(SseDeserializer deserializer); + + @protected + PlatformInt64? sse_decode_opt_box_autoadd_i_64(SseDeserializer deserializer); + + @protected + PluginUpdateAvailable? sse_decode_opt_box_autoadd_plugin_update_available( + SseDeserializer deserializer); + + @protected + SpotubeFullPlaylistObject? + sse_decode_opt_box_autoadd_spotube_full_playlist_object( + SseDeserializer deserializer); + + @protected + int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer); + + @protected + List? sse_decode_opt_list_String(SseDeserializer deserializer); + + @protected + List? sse_decode_opt_list_spotube_image_object( + SseDeserializer deserializer); + + @protected + PluginAbility sse_decode_plugin_ability(SseDeserializer deserializer); + + @protected + PluginAlbumSender sse_decode_plugin_album_sender( + SseDeserializer deserializer); + + @protected + PluginApi sse_decode_plugin_api(SseDeserializer deserializer); + + @protected + PluginArtistSender sse_decode_plugin_artist_sender( + SseDeserializer deserializer); + + @protected + PluginAudioSourceSender sse_decode_plugin_audio_source_sender( + SseDeserializer deserializer); + + @protected + PluginAuthSender sse_decode_plugin_auth_sender(SseDeserializer deserializer); + + @protected + PluginBrowseSender sse_decode_plugin_browse_sender( + SseDeserializer deserializer); + + @protected + PluginConfiguration sse_decode_plugin_configuration( + SseDeserializer deserializer); + + @protected + PluginCoreSender sse_decode_plugin_core_sender(SseDeserializer deserializer); + + @protected + PluginPlaylistSender sse_decode_plugin_playlist_sender( + SseDeserializer deserializer); + + @protected + PluginSearchSender sse_decode_plugin_search_sender( + SseDeserializer deserializer); + + @protected + PluginTrackSender sse_decode_plugin_track_sender( + SseDeserializer deserializer); + + @protected + PluginUpdateAvailable sse_decode_plugin_update_available( + SseDeserializer deserializer); + + @protected + PluginUserSender sse_decode_plugin_user_sender(SseDeserializer deserializer); + + @protected + ScrobbleAlbum sse_decode_scrobble_album(SseDeserializer deserializer); + + @protected + ScrobbleArtist sse_decode_scrobble_artist(SseDeserializer deserializer); + + @protected + ScrobbleDetails sse_decode_scrobble_details(SseDeserializer deserializer); + + @protected + SpotubeAlbumType sse_decode_spotube_album_type(SseDeserializer deserializer); + + @protected + SpotubeAudioLosslessContainerQuality + sse_decode_spotube_audio_lossless_container_quality( + SseDeserializer deserializer); + + @protected + SpotubeAudioLossyContainerQuality + sse_decode_spotube_audio_lossy_container_quality( + SseDeserializer deserializer); + + @protected + SpotubeAudioSourceContainerPreset + sse_decode_spotube_audio_source_container_preset( + SseDeserializer deserializer); + + @protected + SpotubeAudioSourceMatchObject sse_decode_spotube_audio_source_match_object( + SseDeserializer deserializer); + + @protected + SpotubeAudioSourceStreamObject sse_decode_spotube_audio_source_stream_object( + SseDeserializer deserializer); + + @protected + SpotubeBrowseSectionObject sse_decode_spotube_browse_section_object( + SseDeserializer deserializer); + + @protected + SpotubeBrowseSectionResponseObjectItem + sse_decode_spotube_browse_section_response_object_item( + SseDeserializer deserializer); + + @protected + SpotubeFullAlbumObject sse_decode_spotube_full_album_object( + SseDeserializer deserializer); + + @protected + SpotubeFullArtistObject sse_decode_spotube_full_artist_object( + SseDeserializer deserializer); + + @protected + SpotubeFullPlaylistObject sse_decode_spotube_full_playlist_object( + SseDeserializer deserializer); + + @protected + SpotubeImageObject sse_decode_spotube_image_object( + SseDeserializer deserializer); + + @protected + SpotubeMediaCompressionType sse_decode_spotube_media_compression_type( + SseDeserializer deserializer); + + @protected + SpotubePaginationResponseObject sse_decode_spotube_pagination_response_object( + SseDeserializer deserializer); + + @protected + SpotubePaginationResponseObjectItem + sse_decode_spotube_pagination_response_object_item( + SseDeserializer deserializer); + + @protected + SpotubePlugin sse_decode_spotube_plugin(SseDeserializer deserializer); + + @protected + SpotubeSearchResponseObject sse_decode_spotube_search_response_object( + SseDeserializer deserializer); + + @protected + SpotubeSimpleAlbumObject sse_decode_spotube_simple_album_object( + SseDeserializer deserializer); + + @protected + SpotubeSimpleArtistObject sse_decode_spotube_simple_artist_object( + SseDeserializer deserializer); + + @protected + SpotubeSimplePlaylistObject sse_decode_spotube_simple_playlist_object( + SseDeserializer deserializer); + + @protected + SpotubeTrackObject sse_decode_spotube_track_object( + SseDeserializer deserializer); + + @protected + SpotubeUserObject sse_decode_spotube_user_object( + SseDeserializer deserializer); + + @protected + int sse_decode_u_32(SseDeserializer deserializer); + + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer); + @protected int sse_decode_u_8(SseDeserializer deserializer); @@ -43,18 +909,452 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_decode_unit(SseDeserializer deserializer); @protected - int sse_decode_i_32(SseDeserializer deserializer); + BigInt sse_decode_usize(SseDeserializer deserializer); @protected - bool sse_decode_bool(SseDeserializer deserializer); + void sse_encode_AnyhowException( + AnyhowException self, SseSerializer serializer); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + PluginCommand self, SseSerializer serializer); + + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SenderPluginCommand self, SseSerializer serializer); + + @protected + void + sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer); + + @protected + void + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + OpaqueSender self, SseSerializer serializer); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + PluginCommand self, SseSerializer serializer); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + SenderPluginCommand self, SseSerializer serializer); @protected void sse_encode_String(String self, SseSerializer serializer); + @protected + void sse_encode_bool(bool self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_bool(bool self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_f_64(double self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_i_32(int self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_i_64( + PlatformInt64 self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_album_sender( + PluginAlbumSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_artist_sender( + PluginArtistSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_audio_source_sender( + PluginAudioSourceSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_auth_sender( + PluginAuthSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_browse_sender( + PluginBrowseSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_configuration( + PluginConfiguration self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_core_sender( + PluginCoreSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_playlist_sender( + PluginPlaylistSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_search_sender( + PluginSearchSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_track_sender( + PluginTrackSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_update_available( + PluginUpdateAvailable self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_plugin_user_sender( + PluginUserSender self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_scrobble_details( + ScrobbleDetails self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_audio_lossless_container_quality( + SpotubeAudioLosslessContainerQuality self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_audio_lossy_container_quality( + SpotubeAudioLossyContainerQuality self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_audio_source_container_preset( + SpotubeAudioSourceContainerPreset self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_audio_source_match_object( + SpotubeAudioSourceMatchObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_browse_section_object( + SpotubeBrowseSectionObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_full_album_object( + SpotubeFullAlbumObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_full_artist_object( + SpotubeFullArtistObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_full_playlist_object( + SpotubeFullPlaylistObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_plugin( + SpotubePlugin self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_simple_album_object( + SpotubeSimpleAlbumObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_simple_artist_object( + SpotubeSimpleArtistObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_simple_playlist_object( + SpotubeSimplePlaylistObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_spotube_track_object( + SpotubeTrackObject self, SseSerializer serializer); + + @protected + void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer); + + @protected + void sse_encode_f_64(double self, SseSerializer serializer); + + @protected + void sse_encode_i_32(int self, SseSerializer serializer); + + @protected + void sse_encode_i_64(PlatformInt64 self, SseSerializer serializer); + + @protected + void sse_encode_list_String(List self, SseSerializer serializer); + + @protected + void sse_encode_list_plugin_ability( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_plugin_api( + List self, SseSerializer serializer); + @protected void sse_encode_list_prim_u_8_strict( Uint8List self, SseSerializer serializer); + @protected + void sse_encode_list_scrobble_artist( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_audio_lossless_container_quality( + List self, + SseSerializer serializer); + + @protected + void sse_encode_list_spotube_audio_lossy_container_quality( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_audio_source_match_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_audio_source_stream_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_browse_section_response_object_item( + List self, + SseSerializer serializer); + + @protected + void sse_encode_list_spotube_full_artist_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_image_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_pagination_response_object_item( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_simple_album_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_simple_artist_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_simple_playlist_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_track_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_list_spotube_user_object( + List self, SseSerializer serializer); + + @protected + void sse_encode_opt_String(String? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_bool(bool? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_f_64(double? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_i_32(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_i_64( + PlatformInt64? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_plugin_update_available( + PluginUpdateAvailable? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_spotube_full_playlist_object( + SpotubeFullPlaylistObject? self, SseSerializer serializer); + + @protected + void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer); + + @protected + void sse_encode_opt_list_String(List? self, SseSerializer serializer); + + @protected + void sse_encode_opt_list_spotube_image_object( + List? self, SseSerializer serializer); + + @protected + void sse_encode_plugin_ability(PluginAbility self, SseSerializer serializer); + + @protected + void sse_encode_plugin_album_sender( + PluginAlbumSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_api(PluginApi self, SseSerializer serializer); + + @protected + void sse_encode_plugin_artist_sender( + PluginArtistSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_audio_source_sender( + PluginAudioSourceSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_auth_sender( + PluginAuthSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_browse_sender( + PluginBrowseSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_configuration( + PluginConfiguration self, SseSerializer serializer); + + @protected + void sse_encode_plugin_core_sender( + PluginCoreSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_playlist_sender( + PluginPlaylistSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_search_sender( + PluginSearchSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_track_sender( + PluginTrackSender self, SseSerializer serializer); + + @protected + void sse_encode_plugin_update_available( + PluginUpdateAvailable self, SseSerializer serializer); + + @protected + void sse_encode_plugin_user_sender( + PluginUserSender self, SseSerializer serializer); + + @protected + void sse_encode_scrobble_album(ScrobbleAlbum self, SseSerializer serializer); + + @protected + void sse_encode_scrobble_artist( + ScrobbleArtist self, SseSerializer serializer); + + @protected + void sse_encode_scrobble_details( + ScrobbleDetails self, SseSerializer serializer); + + @protected + void sse_encode_spotube_album_type( + SpotubeAlbumType self, SseSerializer serializer); + + @protected + void sse_encode_spotube_audio_lossless_container_quality( + SpotubeAudioLosslessContainerQuality self, SseSerializer serializer); + + @protected + void sse_encode_spotube_audio_lossy_container_quality( + SpotubeAudioLossyContainerQuality self, SseSerializer serializer); + + @protected + void sse_encode_spotube_audio_source_container_preset( + SpotubeAudioSourceContainerPreset self, SseSerializer serializer); + + @protected + void sse_encode_spotube_audio_source_match_object( + SpotubeAudioSourceMatchObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_audio_source_stream_object( + SpotubeAudioSourceStreamObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_browse_section_object( + SpotubeBrowseSectionObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_browse_section_response_object_item( + SpotubeBrowseSectionResponseObjectItem self, SseSerializer serializer); + + @protected + void sse_encode_spotube_full_album_object( + SpotubeFullAlbumObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_full_artist_object( + SpotubeFullArtistObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_full_playlist_object( + SpotubeFullPlaylistObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_image_object( + SpotubeImageObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_media_compression_type( + SpotubeMediaCompressionType self, SseSerializer serializer); + + @protected + void sse_encode_spotube_pagination_response_object( + SpotubePaginationResponseObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_pagination_response_object_item( + SpotubePaginationResponseObjectItem self, SseSerializer serializer); + + @protected + void sse_encode_spotube_plugin(SpotubePlugin self, SseSerializer serializer); + + @protected + void sse_encode_spotube_search_response_object( + SpotubeSearchResponseObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_simple_album_object( + SpotubeSimpleAlbumObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_simple_artist_object( + SpotubeSimpleArtistObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_simple_playlist_object( + SpotubeSimplePlaylistObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_track_object( + SpotubeTrackObject self, SseSerializer serializer); + + @protected + void sse_encode_spotube_user_object( + SpotubeUserObject self, SseSerializer serializer); + + @protected + void sse_encode_u_32(int self, SseSerializer serializer); + + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer); + @protected void sse_encode_u_8(int self, SseSerializer serializer); @@ -62,10 +1362,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_unit(void self, SseSerializer serializer); @protected - void sse_encode_i_32(int self, SseSerializer serializer); - - @protected - void sse_encode_bool(bool self, SseSerializer serializer); + void sse_encode_usize(BigInt self, SseSerializer serializer); } // Section: wire_class @@ -81,4 +1378,100 @@ class RustLibWire implements BaseWire { /// The symbols are looked up in [dynamicLibrary]. RustLibWire(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup; + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSenderPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender'); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSenderPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSenderPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender'); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSenderPtr + .asFunction)>(); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommandPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand'); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommandPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommandPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand'); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommandPtr + .asFunction)>(); + + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommandPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand'); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommandPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommandPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand'); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommandPtr + .asFunction)>(); } diff --git a/lib/src/rust/frb_generated.web.dart b/lib/src/rust/frb_generated.web.dart deleted file mode 100644 index 981737f3..00000000 --- a/lib/src/rust/frb_generated.web.dart +++ /dev/null @@ -1,84 +0,0 @@ -// This file is automatically generated, so please do not edit it. -// @generated by `flutter_rust_bridge`@ 2.11.1. - -// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field - -// Static analysis wrongly picks the IO variant, thus ignore this -// ignore_for_file: argument_type_not_assignable - -import 'api/simple.dart'; -import 'dart:async'; -import 'dart:convert'; -import 'frb_generated.dart'; -import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated_web.dart'; - -abstract class RustLibApiImplPlatform extends BaseApiImpl { - RustLibApiImplPlatform({ - required super.handler, - required super.wire, - required super.generalizedFrbRustBinding, - required super.portManager, - }); - - @protected - String dco_decode_String(dynamic raw); - - @protected - Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); - - @protected - int dco_decode_u_8(dynamic raw); - - @protected - void dco_decode_unit(dynamic raw); - - @protected - String sse_decode_String(SseDeserializer deserializer); - - @protected - Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); - - @protected - int sse_decode_u_8(SseDeserializer deserializer); - - @protected - void sse_decode_unit(SseDeserializer deserializer); - - @protected - int sse_decode_i_32(SseDeserializer deserializer); - - @protected - bool sse_decode_bool(SseDeserializer deserializer); - - @protected - void sse_encode_String(String self, SseSerializer serializer); - - @protected - void sse_encode_list_prim_u_8_strict( - Uint8List self, SseSerializer serializer); - - @protected - void sse_encode_u_8(int self, SseSerializer serializer); - - @protected - void sse_encode_unit(void self, SseSerializer serializer); - - @protected - void sse_encode_i_32(int self, SseSerializer serializer); - - @protected - void sse_encode_bool(bool self, SseSerializer serializer); -} - -// Section: wire_class - -class RustLibWire implements BaseWire { - RustLibWire.fromExternalLibrary(ExternalLibrary lib); -} - -@JS('wasm_bindgen') -external RustLibWasmModule get wasmModule; - -@JS() -@anonymous -extension type RustLibWasmModule._(JSObject _) implements JSObject {} diff --git a/pubspec.lock b/pubspec.lock index ba6b74b3..acaa9b6a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1392,7 +1392,7 @@ packages: source: hosted version: "0.6.7" json_annotation: - dependency: transitive + dependency: "direct main" description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" diff --git a/pubspec.yaml b/pubspec.yaml index 2a75217c..e4d9a61c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -156,6 +156,7 @@ dependencies: rust_lib_spotube: path: rust_builder flutter_rust_bridge: 2.11.1 + json_annotation: ^4.9.0 dev_dependencies: build_runner: ^2.4.13 diff --git a/rust/Cargo.lock b/rust/Cargo.lock index dbb2a220..0a698aa2 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -26,6 +26,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "allo-isolate" version = "0.1.27" @@ -37,6 +46,12 @@ dependencies = [ "backtrace", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android_log-sys" version = "0.3.2" @@ -60,12 +75,24 @@ version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "atomic" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.1.0" @@ -87,6 +114,18 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.10.0" @@ -102,6 +141,167 @@ dependencies = [ "generic-array", ] +[[package]] +name = "boa_ast" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc119a5ad34c3f459062a96907f53358989b173d104258891bb74f95d93747e8" +dependencies = [ + "bitflags 2.10.0", + "boa_interner", + "boa_macros", + "boa_string", + "indexmap", + "num-bigint", + "rustc-hash", +] + +[[package]] +name = "boa_engine" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e637ec52ea66d76b0ca86180c259d6c7bb6e6a6e14b2f36b85099306d8b00cc3" +dependencies = [ + "aligned-vec", + "arrayvec", + "bitflags 2.10.0", + "boa_ast", + "boa_gc", + "boa_interner", + "boa_macros", + "boa_parser", + "boa_string", + "bytemuck", + "cfg-if", + "cow-utils", + "dashmap 6.1.0", + "dynify", + "either", + "fast-float2", + "float16", + "futures-channel", + "futures-concurrency", + "futures-lite", + "hashbrown 0.16.1", + "icu_normalizer", + "indexmap", + "intrusive-collections", + "itertools", + "num-bigint", + "num-integer", + "num-traits", + "num_enum", + "paste", + "portable-atomic", + "rand", + "regress", + "rustc-hash", + "ryu-js", + "serde", + "serde_json", + "small_btree", + "static_assertions", + "tag_ptr", + "tap", + "thin-vec", + "thiserror", + "time", + "xsum", +] + +[[package]] +name = "boa_gc" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1179f690cbfcbe5364cceee5f1cb577265bb6f07b0be6f210aabe270adcf9da" +dependencies = [ + "boa_macros", + "boa_string", + "either", + "hashbrown 0.16.1", + "thin-vec", +] + +[[package]] +name = "boa_interner" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9626505d33dc63d349662437297df1d3afd9d5fc4a2b3ad34e5e1ce879a78848" +dependencies = [ + "boa_gc", + "boa_macros", + "hashbrown 0.16.1", + "indexmap", + "once_cell", + "phf", + "rustc-hash", + "static_assertions", +] + +[[package]] +name = "boa_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f36418a46544b152632c141b0a0b7a453cd69ca150caeef83aee9e2f4b48b7d" +dependencies = [ + "cfg-if", + "cow-utils", + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "boa_parser" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f99bf5b684f0de946378fcfe5f38c3a0fbd51cbf83a0f39ff773a0e218541f" +dependencies = [ + "bitflags 2.10.0", + "boa_ast", + "boa_interner", + "boa_macros", + "fast-float2", + "icu_properties", + "num-bigint", + "num-traits", + "regress", + "rustc-hash", +] + +[[package]] +name = "boa_runtime" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ee83c5e3634de25fe80c785c4a240483daedf9e346a9848ec87f7a13250471" +dependencies = [ + "boa_engine", + "boa_gc", + "bytemuck", + "either", + "futures", + "futures-lite", + "http", + "rustc-hash", + "serde_json", + "url", +] + +[[package]] +name = "boa_string" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ce9d7aa5563a2e14eab111e2ae1a06a69a812f6c0c3d843196c9d03fbef440" +dependencies = [ + "fast-float2", + "itoa", + "paste", + "rustc-hash", + "ryu-js", + "static_assertions", +] + [[package]] name = "build-target" version = "0.4.0" @@ -116,9 +316,23 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "byteorder" @@ -127,19 +341,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "cc" -version = "1.0.83" +name = "bytes" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" + +[[package]] +name = "cc" +version = "1.2.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" dependencies = [ - "libc", + "find-msvc-tools", + "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "console_error_panic_hook" @@ -151,6 +372,44 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" version = "0.1.6" @@ -177,7 +436,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -194,6 +467,21 @@ dependencies = [ "syn", ] +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + [[package]] name = "digest" version = "0.10.7" @@ -204,6 +492,52 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dynify" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81acb15628a3e22358bf73de5e7e62360b8a777dbcb5fc9ac7dfa9ae73723747" +dependencies = [ + "dynify-macros", +] + +[[package]] +name = "dynify-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec431cd708430d5029356535259c5d645d60edd3d39c54e5eea9782d46caa7d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "env_filter" version = "0.1.4" @@ -214,6 +548,76 @@ dependencies = [ "regex", ] +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fast-float2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "float16" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bffafbd079d520191c7c2779ae9cf757601266cf4167d3f659ff09617ff8483" +dependencies = [ + "cfg-if", + "rustc_version", +] + [[package]] name = "flutter_rust_bridge" version = "2.11.1" @@ -257,10 +661,46 @@ dependencies = [ ] [[package]] -name = "futures" -version = "0.3.29" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -272,26 +712,54 @@ dependencies = [ ] [[package]] -name = "futures-channel" -version = "0.3.29" +name = "futures-buffered" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", ] [[package]] -name = "futures-core" -version = "0.3.29" +name = "futures-concurrency" +version = "7.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "0eb68017df91f2e477ed4bea586c59eaecaa47ed885a770d0444e21e62572cd2" +dependencies = [ + "fixedbitset", + "futures-buffered", + "futures-core", + "futures-lite", + "pin-project", + "slab", + "smallvec", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -300,15 +768,28 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -317,21 +798,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -345,6 +826,20 @@ dependencies = [ "slab", ] +[[package]] +name = "generator" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -355,18 +850,77 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.3" @@ -380,11 +934,291 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "js-sys" -version = "0.3.69" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b24a59706036ba941c9476a55cd57b82b77f38a3c667d637ee7cabbc85eaedc" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a97b8ac6235e69506e8dacfb2adf38461d2ce6d3e9bd9c94c4cbc3cd4400a4" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "serde", + "stable_deref_trait", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" +dependencies = [ + "memoffset", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -396,9 +1230,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" @@ -415,6 +1261,28 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "md-5" version = "0.10.6" @@ -431,6 +1299,21 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -440,6 +1323,78 @@ dependencies = [ "adler", ] +[[package]] +name = "mio" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -450,6 +1405,37 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "object" version = "0.32.1" @@ -461,9 +1447,53 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] [[package]] name = "oslog" @@ -472,10 +1502,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80d2043d1f61d77cb2f4b1f7b7b2295f40507f5f8e9d1c8bf10a1ca5f97a3969" dependencies = [ "cc", - "dashmap", + "dashmap 5.5.3", "log", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + [[package]] name = "parking_lot_core" version = "0.9.12" @@ -486,7 +1532,81 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -501,6 +1621,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "portable-atomic" version = "1.11.1" @@ -508,30 +1634,98 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] -name = "proc-macro2" -version = "1.0.70" +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.10.0", ] [[package]] @@ -563,11 +1757,86 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "regress" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2057b2325e68a893284d1538021ab90279adac1139957ca2a74426c6f118fb48" +dependencies = [ + "hashbrown 0.16.1", + "memchr", +] + +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rust_lib_spotube" version = "0.1.0" dependencies = [ + "anyhow", + "boa_engine", + "boa_gc", + "boa_runtime", "flutter_rust_bridge", + "futures", + "heck", + "http", + "reqwest", + "serde", + "serde_json", + "tokio", ] [[package]] @@ -576,12 +1845,229 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "ryu-js" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -591,6 +2077,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "small_btree" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba60d2df92ba73864714808ca68c059734853e6ab722b40e1cf543ebb3a057a" +dependencies = [ + "arrayvec", +] + [[package]] name = "smallvec" version = "1.15.1" @@ -598,16 +2093,151 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "syn" -version = "2.0.39" +name = "socket2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tag_ptr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0e973b34477b7823833469eb0f5a3a60370fef7a453e02d751b59180d0a5a05" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thin-vec" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -618,16 +2248,253 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.34.0" +name = "time" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ - "backtrace", - "num_cpus", - "pin-project-lite", + "deranged", + "itoa", + "js-sys", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", ] +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "serde_core", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "typenum" version = "1.17.0" @@ -640,6 +2507,48 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" @@ -647,27 +2556,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] -name = "wasm-bindgen" -version = "0.2.92" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "cfg-if", - "wasm-bindgen-macro", + "try-lock", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "bumpalo", - "log", + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +dependencies = [ + "cfg-if", "once_cell", - "proc-macro2", - "quote", - "syn", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] @@ -685,9 +2606,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -695,22 +2616,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" @@ -722,8 +2646,441 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "xsum" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0637d3a5566a82fa5214bae89087bc8c9fb94cd8e8a3c07feb691bb8d9c632db" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "serde", + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 0ec7e44e..2758e1af 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -6,8 +6,23 @@ edition = "2021" [lib] crate-type = ["cdylib", "staticlib"] +[[bin]] +name = "spotube" +path = "src/main.rs" + [dependencies] flutter_rust_bridge = "=2.11.1" +boa_engine = "0.21.0" +boa_runtime = "0.21.0" +boa_gc = "0.21.0" +anyhow = "1" +reqwest = { version = "0.12.x" } +http = { version = "1.3.1" } +serde_json = "1" +serde = { version = "1.0.228", features = ["derive"] } +futures = "0.3.x" +tokio = { version = "1.48.0", features = ["full"] } +heck = "0.5.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(frb_expand)'] } diff --git a/rust/src/api/mod.rs b/rust/src/api/mod.rs index b252f36b..940d0df8 100644 --- a/rust/src/api/mod.rs +++ b/rust/src/api/mod.rs @@ -1 +1,7 @@ -pub mod simple; +pub mod plugin; + +#[flutter_rust_bridge::frb(init)] +pub fn init_app() { + // Default utilities - feel free to customize + flutter_rust_bridge::setup_default_user_utils(); +} diff --git a/rust/src/api/plugin/commands.rs b/rust/src/api/plugin/commands.rs new file mode 100644 index 00000000..4fe0e596 --- /dev/null +++ b/rust/src/api/plugin/commands.rs @@ -0,0 +1,271 @@ +use flutter_rust_bridge::frb; +use crate::api::plugin::models::album::SpotubeFullAlbumObject; +use crate::api::plugin::models::artist::SpotubeFullArtistObject; +use crate::api::plugin::models::audio_source::{ + SpotubeAudioSourceMatchObject, SpotubeAudioSourceStreamObject, +}; +use crate::api::plugin::models::core::{ + PluginConfiguration, PluginUpdateAvailable, ScrobbleDetails, +}; +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::api::plugin::models::playlist::SpotubeFullPlaylistObject; +use crate::api::plugin::models::search::SpotubeSearchResponseObject; +use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::user::SpotubeUserObject; +use tokio::sync::oneshot; + +pub enum ArtistCommands { + GetArtist { + id: String, + response_tx: oneshot::Sender>, + }, + TopTracks { + id: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Albums { + id: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Related { + id: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Save { + ids: Vec, + response_tx: oneshot::Sender>, + }, + Unsave { + ids: Vec, + response_tx: oneshot::Sender>, + }, +} + +pub enum AlbumCommands { + GetAlbum { + id: String, + response_tx: oneshot::Sender>, + }, + Tracks { + id: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Releases { + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Save { + ids: Vec, + response_tx: oneshot::Sender>, + }, + Unsave { + ids: Vec, + response_tx: oneshot::Sender>, + }, +} + +pub enum AudioSourceCommands { + Matches { + track: SpotubeTrackObject, + response_tx: oneshot::Sender>>, + }, + Streams { + matched: SpotubeAudioSourceMatchObject, + response_tx: oneshot::Sender>>, + }, +} + +pub enum AuthCommands { + Authenticate { + response_tx: oneshot::Sender>, + }, + Logout { + response_tx: oneshot::Sender>, + }, + IsAuthenticated { + response_tx: oneshot::Sender>, + }, +} + +pub enum BrowseCommands { + Sections { + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + SectionItems { + id: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, +} + +pub enum CoreCommands { + CheckUpdate { + plugin_config: PluginConfiguration, + response_tx: oneshot::Sender>>, + }, + Support { + response_tx: oneshot::Sender>, + }, + Scrobble { + details: ScrobbleDetails, + response_tx: oneshot::Sender>, + }, +} + +pub enum PlaylistCommands { + GetPlaylist { + id: String, + response_tx: oneshot::Sender>, + }, + Tracks { + id: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + CreatePlaylist { + user_id: String, + name: String, + description: Option, + public: Option, + collaborative: Option, + response_tx: oneshot::Sender>>, + }, + UpdatePlaylist { + playlist_id: String, + name: Option, + description: Option, + public: Option, + collaborative: Option, + response_tx: oneshot::Sender>, + }, + DeletePlaylist { + playlist_id: String, + response_tx: oneshot::Sender>, + }, + AddTracks { + playlist_id: String, + track_ids: Vec, + position: Option, + response_tx: oneshot::Sender>, + }, + RemoveTracks { + playlist_id: String, + track_ids: Vec, + response_tx: oneshot::Sender>, + }, + Save { + playlist_id: String, + response_tx: oneshot::Sender>, + }, + Unsave { + playlist_id: String, + response_tx: oneshot::Sender>, + }, +} + +pub enum SearchCommands { + Chips { + response_tx: oneshot::Sender>>, + }, + All { + query: String, + response_tx: oneshot::Sender>, + }, + Tracks { + query: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Albums { + query: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Artists { + query: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + Playlists { + query: String, + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, +} + +pub enum TrackCommands { + GetTrack { + id: String, + response_tx: oneshot::Sender>, + }, + Save { + ids: Vec, + response_tx: oneshot::Sender>, + }, + Unsave { + ids: Vec, + response_tx: oneshot::Sender>, + }, + Radio { + id: String, + response_tx: oneshot::Sender>>, + }, +} + +pub enum UserCommands { + Me { + response_tx: oneshot::Sender>, + }, + SavedTracks { + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + SavedAlbums { + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + SavedArtists { + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, + SavedPlaylists { + offset: Option, + limit: Option, + response_tx: oneshot::Sender>, + }, +} + +#[frb(unignore)] +pub enum PluginCommand { + Artist(ArtistCommands), + Album(AlbumCommands), + AudioSource(AudioSourceCommands), + Browse(BrowseCommands), + Track(TrackCommands), + User(UserCommands), + Playlist(PlaylistCommands), + Search(SearchCommands), + Core(CoreCommands), + Auth(AuthCommands), + Shutdown, +} diff --git a/rust/src/api/plugin/executors.rs b/rust/src/api/plugin/executors.rs new file mode 100644 index 00000000..9a6e0e5e --- /dev/null +++ b/rust/src/api/plugin/executors.rs @@ -0,0 +1,401 @@ +use crate::api::plugin::commands::{ + AlbumCommands, ArtistCommands, AudioSourceCommands, AuthCommands, BrowseCommands, CoreCommands, + PlaylistCommands, SearchCommands, TrackCommands, UserCommands, +}; +use crate::internal::album::PluginAlbumEndpoint; +use crate::internal::artist::PluginArtistEndpoint; +use crate::internal::audio_source::PluginAudioSourceEndpoint; +use crate::internal::auth::PluginAuthEndpoint; +use crate::internal::browse::PluginBrowseEndpoint; +use crate::internal::core::PluginCoreEndpoint; +use crate::internal::playlist::PluginPlaylistEndpoint; +use crate::internal::search::PluginSearchEndpoint; +use crate::internal::track::PluginTrackEndpoint; +use crate::internal::user::PluginUserEndpoint; +use boa_engine::Context; +use flutter_rust_bridge::frb; +use std::fmt::Debug; +use tokio::sync::oneshot; + +fn send_response(tx: oneshot::Sender, response: T) -> anyhow::Result<()> +where + T: Debug, +{ + tx.send(response) + .map_err(|e| anyhow::anyhow!("Failed to send response: {:?}", e)) +} + +#[frb(ignore)] +pub async fn execute_artists(command: ArtistCommands, context: &mut Context) -> anyhow::Result<()> { + let mut artist = PluginArtistEndpoint::new(context); + match command { + ArtistCommands::GetArtist { id, response_tx } => { + let artist = artist.get_artist(id).await; + send_response(response_tx, artist) + } + ArtistCommands::TopTracks { + id, + offset, + limit, + response_tx, + } => { + let tracks = artist.top_tracks(id, offset, limit).await; + send_response(response_tx, tracks) + } + ArtistCommands::Albums { + id, + offset, + limit, + response_tx, + } => { + let albums = artist.albums(id, offset, limit).await; + send_response(response_tx, albums) + } + ArtistCommands::Related { + id, + offset, + limit, + response_tx, + } => { + let artists = artist.related(id, offset, limit).await; + send_response(response_tx, artists) + } + ArtistCommands::Save { ids, response_tx } => { + let res = artist.save(ids).await; + send_response(response_tx, res) + } + ArtistCommands::Unsave { ids, response_tx } => { + let res = artist.unsave(ids).await; + send_response(response_tx, res) + } + } +} + +#[frb(ignore)] +pub async fn execute_albums(command: AlbumCommands, context: &mut Context) -> anyhow::Result<()> { + let mut album = PluginAlbumEndpoint::new(context); + match command { + AlbumCommands::GetAlbum { id, response_tx } => { + let album = album.get_album(id).await; + send_response(response_tx, album) + } + AlbumCommands::Tracks { + id, + offset, + limit, + response_tx, + } => { + let tracks = album.tracks(id, offset, limit).await; + send_response(response_tx, tracks) + } + AlbumCommands::Releases { + offset, + limit, + response_tx, + } => { + let releases = album.releases(offset, limit).await; + send_response(response_tx, releases) + } + AlbumCommands::Save { ids, response_tx } => { + let res = album.save(ids).await; + send_response(response_tx, res) + } + AlbumCommands::Unsave { ids, response_tx } => { + let res = album.unsave(ids).await; + send_response(response_tx, res) + } + } +} + +#[frb(ignore)] +pub async fn execute_audio_source( + command: AudioSourceCommands, + context: &mut Context, +) -> anyhow::Result<()> { + let mut audio_source = PluginAudioSourceEndpoint::new(context); + match command { + AudioSourceCommands::Matches { track, response_tx } => { + let audio_source = audio_source.matches(track).await; + send_response(response_tx, audio_source) + } + AudioSourceCommands::Streams { + matched, + response_tx, + } => { + let audio_source = audio_source.streams(matched).await; + send_response(response_tx, audio_source) + } + } +} + +#[frb(ignore)] +pub async fn execute_auth(command: AuthCommands, context: &mut Context) -> anyhow::Result<()> { + let mut auth = PluginAuthEndpoint::new(context); + match command { + AuthCommands::Authenticate { response_tx } => { + let res = auth.authenticate().await; + send_response(response_tx, res) + } + AuthCommands::IsAuthenticated { response_tx } => { + let res = auth.is_authenticated(); + send_response(response_tx, res) + } + AuthCommands::Logout { response_tx } => { + let res = auth.logout().await; + send_response(response_tx, res) + } + } +} + +#[frb(ignore)] +pub async fn execute_browse(command: BrowseCommands, context: &mut Context) -> anyhow::Result<()> { + let mut browse = PluginBrowseEndpoint::new(context); + match command { + BrowseCommands::Sections { + offset, + limit, + response_tx, + } => { + let sections = browse.sections(offset, limit).await; + send_response(response_tx, sections) + } + BrowseCommands::SectionItems { + id, + offset, + limit, + response_tx, + } => { + let items = browse.section_items(id, offset, limit).await; + send_response(response_tx, items) + } + } +} + +#[frb(ignore)] +pub async fn execute_core(command: CoreCommands, context: &mut Context) -> anyhow::Result<()> { + let mut core = PluginCoreEndpoint::new(context); + match command { + CoreCommands::CheckUpdate { + response_tx, + plugin_config, + } => { + let res = core.check_update(plugin_config).await; + send_response(response_tx, res) + } + CoreCommands::Scrobble { + details, + response_tx, + } => { + let res = core.scrobble(details).await; + send_response(response_tx, res) + } + CoreCommands::Support { response_tx } => { + let res = core.support(); + send_response(response_tx, res) + } + } +} + +#[frb(ignore)] +pub async fn execute_playlist( + command: PlaylistCommands, + context: &mut Context, +) -> anyhow::Result<()> { + let mut playlist = PluginPlaylistEndpoint::new(context); + match command { + PlaylistCommands::GetPlaylist { id, response_tx } => { + let playlist = playlist.get_playlist(id).await; + send_response(response_tx, playlist) + } + PlaylistCommands::Tracks { + id, + offset, + limit, + response_tx, + } => { + let tracks = playlist.tracks(id, offset, limit).await; + send_response(response_tx, tracks) + } + PlaylistCommands::CreatePlaylist { + user_id, + name, + description, + public, + collaborative, + response_tx, + } => { + let playlist = playlist + .create(user_id, name, description, public, collaborative) + .await; + send_response(response_tx, playlist) + } + PlaylistCommands::UpdatePlaylist { + playlist_id, + name, + description, + public, + collaborative, + response_tx, + } => { + let res = playlist + .update(playlist_id, name, description, public, collaborative) + .await; + send_response(response_tx, res) + } + PlaylistCommands::DeletePlaylist { + playlist_id, + response_tx, + } => { + let res = playlist.delete_playlist(playlist_id).await; + send_response(response_tx, res) + } + PlaylistCommands::AddTracks { + playlist_id, + track_ids, + position, + response_tx, + } => { + let res = playlist.add_tracks(playlist_id, track_ids, position).await; + send_response(response_tx, res) + } + PlaylistCommands::RemoveTracks { + playlist_id, + track_ids, + response_tx, + } => { + let res = playlist.remove_tracks(playlist_id, track_ids).await; + send_response(response_tx, res) + } + PlaylistCommands::Save { + playlist_id, + response_tx, + } => { + let res = playlist.save(playlist_id).await; + send_response(response_tx, res) + } + PlaylistCommands::Unsave { + playlist_id, + response_tx, + } => { + let res = playlist.unsave(playlist_id).await; + send_response(response_tx, res) + } + } +} + +#[frb(ignore)] +pub async fn execute_search(command: SearchCommands, context: &mut Context) -> anyhow::Result<()> { + let mut search = PluginSearchEndpoint::new(context); + match command { + SearchCommands::Chips { response_tx } => { + let chips = search.chips(); + send_response(response_tx, chips) + } + SearchCommands::All { query, response_tx } => { + let all = search.all(query).await; + send_response(response_tx, all) + } + SearchCommands::Tracks { + query, + offset, + limit, + response_tx, + } => { + let tracks = search.tracks(query, offset, limit).await; + send_response(response_tx, tracks) + } + SearchCommands::Albums { + query, + offset, + limit, + response_tx, + } => { + let albums = search.albums(query, offset, limit).await; + send_response(response_tx, albums) + } + SearchCommands::Artists { + query, + offset, + limit, + response_tx, + } => { + let artists = search.artists(query, offset, limit).await; + send_response(response_tx, artists) + } + SearchCommands::Playlists { + query, + offset, + limit, + response_tx, + } => { + let playlists = search.playlists(query, offset, limit).await; + send_response(response_tx, playlists) + } + } +} + +#[frb(ignore)] +pub async fn execute_track(command: TrackCommands, context: &mut Context) -> anyhow::Result<()> { + let mut track = PluginTrackEndpoint::new(context); + match command { + TrackCommands::GetTrack { id, response_tx } => { + let res = track.get_track(id).await; + send_response(response_tx, res) + } + TrackCommands::Save { ids, response_tx } => { + let res = track.save(ids).await; + send_response(response_tx, res) + } + TrackCommands::Unsave { ids, response_tx } => { + let res = track.unsave(ids).await; + send_response(response_tx, res) + } + TrackCommands::Radio { id, response_tx } => { + let res = track.radio(id).await; + send_response(response_tx, res) + } + } +} + +#[frb(ignore)] +pub async fn execute_user(command: UserCommands, context: &mut Context) -> anyhow::Result<()> { + let mut user = PluginUserEndpoint::new(context); + match command { + UserCommands::Me { response_tx } => { + let me = user.me().await; + send_response(response_tx, me) + } + UserCommands::SavedTracks { + offset, + limit, + response_tx, + } => { + let tracks = user.saved_tracks(offset, limit).await; + send_response(response_tx, tracks) + } + UserCommands::SavedAlbums { + offset, + limit, + response_tx, + } => { + let albums = user.saved_albums(offset, limit).await; + send_response(response_tx, albums) + } + UserCommands::SavedArtists { + offset, + limit, + response_tx, + } => { + let artists = user.saved_artists(offset, limit).await; + send_response(response_tx, artists) + } + UserCommands::SavedPlaylists { + offset, + limit, + response_tx, + } => { + let playlists = user.saved_playlists(offset, limit).await; + send_response(response_tx, playlists) + } + } +} diff --git a/rust/src/api/plugin/mod.rs b/rust/src/api/plugin/mod.rs new file mode 100644 index 00000000..14a1d763 --- /dev/null +++ b/rust/src/api/plugin/mod.rs @@ -0,0 +1,5 @@ +pub mod commands; +pub mod plugin; +pub mod executors; +pub mod senders; +pub mod models; \ No newline at end of file diff --git a/rust/src/api/plugin/models/album.rs b/rust/src/api/plugin/models/album.rs new file mode 100644 index 00000000..4876d3d4 --- /dev/null +++ b/rust/src/api/plugin/models/album.rs @@ -0,0 +1,44 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::artist::SpotubeSimpleArtistObject; +use crate::api::plugin::models::image::SpotubeImageObject; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub enum SpotubeAlbumType { + Album, + Single, + Compilation, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeSimpleAlbumObject { + pub type_name: String, + pub id: String, + pub name: String, + pub external_uri: String, + pub artists: Vec, + #[serde(default)] + pub images: Vec, + pub album_type: SpotubeAlbumType, + pub release_date: Option, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeFullAlbumObject { + pub type_name: String, + pub id: String, + pub name: String, + pub artists: Vec, + #[serde(default)] + pub images: Vec, + pub release_date: String, + pub external_uri: String, + pub total_tracks: i32, + pub album_type: SpotubeAlbumType, + pub record_label: Option, + pub genres: Option>, +} diff --git a/rust/src/api/plugin/models/artist.rs b/rust/src/api/plugin/models/artist.rs new file mode 100644 index 00000000..e9e570d7 --- /dev/null +++ b/rust/src/api/plugin/models/artist.rs @@ -0,0 +1,28 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::image::SpotubeImageObject; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeSimpleArtistObject { + pub type_name: String, + pub id: String, + pub name: String, + pub external_uri: String, + pub images: Option>, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeFullArtistObject { + pub type_name: String, + pub id: String, + pub name: String, + pub external_uri: String, + #[serde(default)] + pub images: Vec, + pub genres: Option>, + pub followers: Option, +} \ No newline at end of file diff --git a/rust/src/api/plugin/models/audio_source.rs b/rust/src/api/plugin/models/audio_source.rs new file mode 100644 index 00000000..b3b47dea --- /dev/null +++ b/rust/src/api/plugin/models/audio_source.rs @@ -0,0 +1,111 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[frb(dart_metadata=("freezed"),json_serializable)] +#[serde(rename_all = "lowercase")] +pub enum SpotubeMediaCompressionType { + Lossy, + Lossless, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeAudioLossyContainerQuality { + pub bitrate: i32, +} + +impl SpotubeAudioLossyContainerQuality { + pub fn to_string_fmt(&self) -> String { + let kbps = self.bitrate as f64 / 1000.0; + if kbps.fract() == 0.0 { + format!("{}kbps", kbps as i32) + } else { + format!("{:.1}kbps", kbps) + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeAudioLosslessContainerQuality { + pub bit_depth: i32, + pub sample_rate: i32, +} + +impl SpotubeAudioLosslessContainerQuality { + #[frb(sync)] + pub fn to_string_fmt(&self) -> String { + let khz = self.sample_rate as f64 / 1000.0; + if khz.fract() == 0.0 { + format!("{}bit • {}kHz", self.bit_depth, khz as i32) + } else { + format!("{}bit • {:.1}kHz", self.bit_depth, khz) + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[frb(dart_metadata=("freezed"),json_serializable)] +#[serde(tag = "type", content = "data")] +pub enum SpotubeAudioSourceContainerPreset { + #[serde(rename = "lossy")] + Lossy { + #[serde(rename = "type")] + compression_type: SpotubeMediaCompressionType, + name: String, + qualities: Vec, + }, + + #[serde(rename = "lossless")] + Lossless { + #[serde(rename = "type")] + compression_type: SpotubeMediaCompressionType, + name: String, + qualities: Vec, + }, +} + +impl SpotubeAudioSourceContainerPreset { + #[frb(sync)] + pub fn file_extension(&self) -> String { + let name = match self { + Self::Lossy { name, .. } => name, + Self::Lossless { name, .. } => name, + }; + + match name.as_str() { + "mp4" => "m4a".into(), + "webm" => "weba".into(), + other => other.into(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeAudioSourceMatchObject { + pub type_name: String, + pub id: String, + pub title: String, + pub artists: Vec, + pub duration: u64, // Duration in ms + + pub thumbnail: Option, + pub external_uri: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeAudioSourceStreamObject { + pub type_name: String, + pub url: String, + pub container: String, + #[serde(rename = "type")] + pub compression_type: SpotubeMediaCompressionType, + + pub codec: Option, + pub bitrate: Option, + pub bit_depth: Option, + pub sample_rate: Option, +} diff --git a/rust/src/api/plugin/models/browse.rs b/rust/src/api/plugin/models/browse.rs new file mode 100644 index 00000000..7a9a9a7e --- /dev/null +++ b/rust/src/api/plugin/models/browse.rs @@ -0,0 +1,37 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::album::{SpotubeFullAlbumObject, SpotubeSimpleAlbumObject}; +use crate::api::plugin::models::artist::{SpotubeFullArtistObject, SpotubeSimpleArtistObject}; +use crate::api::plugin::models::playlist::{SpotubeFullPlaylistObject, SpotubeSimplePlaylistObject}; +use crate::api::plugin::models::track::SpotubeTrackObject; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"))] +pub struct SpotubeBrowseSectionObject { + pub type_name: String, + pub id: String, + pub title: String, + pub external_uri: String, + pub browse_more: bool, + pub items: Vec, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase", tag = "type_name")] +pub enum SpotubeBrowseSectionResponseObjectItem { + #[serde(rename = "track")] + Track(SpotubeTrackObject), + #[serde(rename = "playlist_full")] + PlaylistFull(SpotubeFullPlaylistObject), + #[serde(rename = "playlist_simple")] + PlaylistSimple(SpotubeSimplePlaylistObject), + #[serde(rename = "album_simple")] + AlbumSimple(SpotubeSimpleAlbumObject), + #[serde(rename = "album_full")] + AlbumFull(SpotubeFullAlbumObject), + #[serde(rename = "artist_full")] + ArtistFull(SpotubeFullArtistObject), + #[serde(rename = "artist_simple")] + ArtistSimple(SpotubeSimpleArtistObject), +} diff --git a/rust/src/api/plugin/models/core.rs b/rust/src/api/plugin/models/core.rs new file mode 100644 index 00000000..d1ab9f5a --- /dev/null +++ b/rust/src/api/plugin/models/core.rs @@ -0,0 +1,78 @@ +use heck::ToKebabCase; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum PluginApi { + Webview, + Localstorage, + Timezone, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +pub enum PluginAbility { + #[serde(rename = "authentication")] + Authentication, + #[serde(rename = "scrobbling")] + Scrobbling, + #[serde(rename = "metadata")] + Metadata, + #[serde(rename = "audio-source")] + AudioSource, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PluginConfiguration { + pub name: String, + pub description: String, + pub version: String, + pub author: String, + pub entry_point: String, + pub plugin_api_version: String, + + #[serde(default)] + pub apis: Vec, + + #[serde(default)] + pub abilities: Vec, + + pub repository: Option, +} + +impl PluginConfiguration { + pub fn slug(&self) -> String { + self.name.to_kebab_case() + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PluginUpdateAvailable { + pub download_url: String, + pub version: String, + pub changelog: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ScrobbleArtist { + pub id: String, + pub name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ScrobbleAlbum { + pub id: String, + pub name: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ScrobbleDetails { + pub id: String, + pub title: String, + pub artists: Vec, + pub album: ScrobbleAlbum, + pub timestamp: Option, + pub duration_ms: Option, + pub isrc: Option, +} diff --git a/rust/src/api/plugin/models/image.rs b/rust/src/api/plugin/models/image.rs new file mode 100644 index 00000000..e43c1eb7 --- /dev/null +++ b/rust/src/api/plugin/models/image.rs @@ -0,0 +1,11 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeImageObject { + pub type_name: String, + pub url: String, + pub width: Option, + pub height: Option, +} \ No newline at end of file diff --git a/rust/src/api/plugin/models/mod.rs b/rust/src/api/plugin/models/mod.rs new file mode 100644 index 00000000..a17dd5e3 --- /dev/null +++ b/rust/src/api/plugin/models/mod.rs @@ -0,0 +1,11 @@ +pub mod audio_source; +pub mod album; +pub mod artist; +pub mod browse; +pub mod image; +pub mod search; +pub mod playlist; +pub mod track; +pub mod user; +pub mod pagination; +pub mod core; diff --git a/rust/src/api/plugin/models/pagination.rs b/rust/src/api/plugin/models/pagination.rs new file mode 100644 index 00000000..52e1b512 --- /dev/null +++ b/rust/src/api/plugin/models/pagination.rs @@ -0,0 +1,39 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::album::{SpotubeFullAlbumObject, SpotubeSimpleAlbumObject}; +use crate::api::plugin::models::artist::{SpotubeFullArtistObject, SpotubeSimpleArtistObject}; +use crate::api::plugin::models::browse::SpotubeBrowseSectionObject; +use crate::api::plugin::models::playlist::{SpotubeFullPlaylistObject, SpotubeSimplePlaylistObject}; +use crate::api::plugin::models::track::SpotubeTrackObject; + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"))] +pub struct SpotubePaginationResponseObject { + pub limit: i32, + pub next_offset: Option, + pub total: i32, + pub has_more: bool, + pub items: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(rename_all = "camelCase", tag = "type_name")] +pub enum SpotubePaginationResponseObjectItem { + #[serde(rename = "track")] + Track(SpotubeTrackObject), + #[serde(rename = "playlist_full")] + PlaylistFull(SpotubeFullPlaylistObject), + #[serde(rename = "playlist_simple")] + PlaylistSimple(SpotubeSimplePlaylistObject), + #[serde(rename = "album_simple")] + AlbumSimple(SpotubeSimpleAlbumObject), + #[serde(rename = "album_full")] + AlbumFull(SpotubeFullAlbumObject), + #[serde(rename = "artist_full")] + ArtistFull(SpotubeFullArtistObject), + #[serde(rename = "artist_simple")] + ArtistSimple(SpotubeSimpleArtistObject), + #[serde(rename = "browse_section")] + BrowseSection(SpotubeBrowseSectionObject), +} diff --git a/rust/src/api/plugin/models/playlist.rs b/rust/src/api/plugin/models/playlist.rs new file mode 100644 index 00000000..583897b3 --- /dev/null +++ b/rust/src/api/plugin/models/playlist.rs @@ -0,0 +1,38 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::image::SpotubeImageObject; +use crate::api::plugin::models::user::SpotubeUserObject; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeSimplePlaylistObject { + pub type_name: String, + pub id: String, + pub name: String, + pub description: String, + pub external_uri: String, + pub owner: SpotubeUserObject, + #[serde(default)] + pub images: Vec, // @Default([]) +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeFullPlaylistObject { + pub type_name: String, + pub id: String, + pub name: String, + pub description: String, + pub external_uri: String, + pub owner: SpotubeUserObject, + #[serde(default)] + pub images: Vec, // @Default([]) + #[serde(default)] + pub collaborators: Vec, // @Default([]) + #[serde(default)] + pub collaborative: bool, // @Default(false) + #[serde(default)] + pub public: bool, // @Default(false) +} \ No newline at end of file diff --git a/rust/src/api/plugin/models/search.rs b/rust/src/api/plugin/models/search.rs new file mode 100644 index 00000000..7a753050 --- /dev/null +++ b/rust/src/api/plugin/models/search.rs @@ -0,0 +1,17 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::album::SpotubeSimpleAlbumObject; +use crate::api::plugin::models::artist::SpotubeFullArtistObject; +use crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject; +use crate::api::plugin::models::track::SpotubeTrackObject; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeSearchResponseObject { + pub type_name: String, + pub albums: Vec, + pub artists: Vec, + pub playlists: Vec, + pub tracks: Vec, +} \ No newline at end of file diff --git a/rust/src/api/plugin/models/track.rs b/rust/src/api/plugin/models/track.rs new file mode 100644 index 00000000..943b6f2c --- /dev/null +++ b/rust/src/api/plugin/models/track.rs @@ -0,0 +1,20 @@ +use flutter_rust_bridge::frb; +use crate::api::plugin::models::album::SpotubeSimpleAlbumObject; +use crate::api::plugin::models::artist::SpotubeSimpleArtistObject; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeTrackObject { + pub type_name: String, + pub id: String, + pub name: String, + pub external_uri: String, + #[serde(default)] + pub artists: Vec, + pub album: SpotubeSimpleAlbumObject, + pub duration_ms: u64, // Duration in ms + pub isrc: String, + pub explicit: bool, +} diff --git a/rust/src/api/plugin/models/user.rs b/rust/src/api/plugin/models/user.rs new file mode 100644 index 00000000..549e3524 --- /dev/null +++ b/rust/src/api/plugin/models/user.rs @@ -0,0 +1,15 @@ +use flutter_rust_bridge::frb; +use serde::{Deserialize, Serialize}; +use crate::api::plugin::models::image::SpotubeImageObject; + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +#[frb(dart_metadata=("freezed"),json_serializable)] +pub struct SpotubeUserObject { + pub type_name: String, + pub id: String, + pub name: String, + #[serde(default)] + pub images: Vec, // @Default([]) + pub external_uri: String, +} diff --git a/rust/src/api/plugin/plugin.rs b/rust/src/api/plugin/plugin.rs new file mode 100644 index 00000000..3d54d87b --- /dev/null +++ b/rust/src/api/plugin/plugin.rs @@ -0,0 +1,137 @@ +use crate::api::plugin::commands::PluginCommand; +use crate::api::plugin::executors::{ + execute_albums, execute_artists, execute_audio_source, execute_auth, execute_browse, + execute_core, execute_playlist, execute_search, execute_track, execute_user, +}; +use crate::api::plugin::models::core::PluginConfiguration; +use crate::api::plugin::senders::{ + PluginAlbumSender, PluginArtistSender, PluginAudioSourceSender, PluginAuthSender, + PluginBrowseSender, PluginCoreSender, PluginPlaylistSender, PluginSearchSender, + PluginTrackSender, PluginUserSender, +}; +use crate::internal::apis::fetcher::ReqwestFetcher; +use anyhow::anyhow; +use boa_engine::{Context, Source}; +use boa_runtime::{fetch, interval, microtask, text, Console, DefaultLogger}; +use flutter_rust_bridge::frb; +use std::thread; +use tokio::runtime::Runtime; +use tokio::sync::mpsc; +use tokio::sync::mpsc::Sender; + +#[derive(Debug, Clone)] +#[frb(opaque)] +pub struct OpaqueSender { + pub sender: Sender, +} + +#[frb(ignore)] +async fn js_executor_thread( + plugin_script: String, + plugin_config: PluginConfiguration, + mut rx: mpsc::Receiver, +) -> anyhow::Result<()> { + let mut context = create_context()?; + let injection = format!( + "const pluginInstance = new {}();", + plugin_config.entry_point + ); + let script = format!("{}\n{}", plugin_script, injection); + + context + .eval(Source::from_bytes(script.as_bytes())) + .map_err(|e| anyhow!("{}", e))?; + + while let Some(command) = rx.blocking_recv() { + match command { + PluginCommand::Artist(commands) => execute_artists(commands, &mut context).await?, + PluginCommand::Album(commands) => execute_albums(commands, &mut context).await?, + PluginCommand::AudioSource(commands) => { + execute_audio_source(commands, &mut context).await? + } + PluginCommand::Auth(commands) => execute_auth(commands, &mut context).await?, + PluginCommand::Browse(commands) => execute_browse(commands, &mut context).await?, + PluginCommand::Core(commands) => execute_core(commands, &mut context).await?, + PluginCommand::Playlist(commands) => execute_playlist(commands, &mut context).await?, + PluginCommand::Search(commands) => execute_search(commands, &mut context).await?, + PluginCommand::Track(commands) => execute_track(commands, &mut context).await?, + PluginCommand::User(commands) => execute_user(commands, &mut context).await?, + PluginCommand::Shutdown => { + println!("JS Executor thread shutting down."); + // This command doesn't send a response; break the loop instead. + return Ok(()); + } + }; + } + + Ok(()) +} + +#[frb(ignore)] +pub fn create_context() -> anyhow::Result { + let mut context = Context::default(); + Console::register_with_logger(DefaultLogger, &mut context).map_err(|e| anyhow!("{}", e))?; + fetch::register(ReqwestFetcher::new(), None, &mut context).map_err(|e| anyhow!("{}", e))?; + interval::register(&mut context).map_err(|e| anyhow!("{}", e))?; + microtask::register(None, &mut context).map_err(|e| anyhow!("{}", e))?; + text::register(None, &mut context).map_err(|e| anyhow!("{}", e))?; + interval::register(&mut context).map_err(|e| anyhow!("{}", e))?; + microtask::register(None, &mut context).map_err(|e| anyhow!("{}", e))?; + + Ok(context) +} + +pub struct SpotubePlugin { + pub artist: PluginArtistSender, + pub album: PluginAlbumSender, + pub audio_source: PluginAudioSourceSender, + pub auth: PluginAuthSender, + pub browse: PluginBrowseSender, + pub core: PluginCoreSender, + pub playlist: PluginPlaylistSender, + pub search: PluginSearchSender, + pub track: PluginTrackSender, + pub user: PluginUserSender, +} + +impl SpotubePlugin { + #[frb(sync)] + pub fn new() -> Self { + Self { + artist: PluginArtistSender::new(), + album: PluginAlbumSender::new(), + audio_source: PluginAudioSourceSender::new(), + auth: PluginAuthSender::new(), + browse: PluginBrowseSender::new(), + core: PluginCoreSender::new(), + playlist: PluginPlaylistSender::new(), + search: PluginSearchSender::new(), + track: PluginTrackSender::new(), + user: PluginUserSender::new(), + } + } + + #[frb(sync)] + pub fn new_context( + plugin_script: String, + plugin_config: PluginConfiguration, + ) -> anyhow::Result { + let (command_tx, command_rx) = mpsc::channel(32); + + let _thread_handle = thread::spawn(|| { + let rt = Runtime::new().unwrap(); + rt.block_on(async { + if let Err(e) = js_executor_thread(plugin_script, plugin_config, command_rx).await { + eprintln!("JS Executor thread encountered a fatal error: {:?}", e); + } + }); + }); + + Ok(OpaqueSender { sender: command_tx }) + } + + pub async fn dispose(&self, tx: OpaqueSender) -> anyhow::Result<()> { + tx.sender.send(PluginCommand::Shutdown).await?; + Ok(()) + } +} diff --git a/rust/src/api/plugin/senders.rs b/rust/src/api/plugin/senders.rs new file mode 100644 index 00000000..b35f386f --- /dev/null +++ b/rust/src/api/plugin/senders.rs @@ -0,0 +1,886 @@ +use crate::api::plugin::commands::{ + AlbumCommands, ArtistCommands, AudioSourceCommands, AuthCommands, BrowseCommands, CoreCommands, + PlaylistCommands, PluginCommand, SearchCommands, TrackCommands, UserCommands, +}; +use crate::api::plugin::models::album::SpotubeFullAlbumObject; +use crate::api::plugin::models::artist::SpotubeFullArtistObject; +use crate::api::plugin::models::audio_source::{ + SpotubeAudioSourceMatchObject, SpotubeAudioSourceStreamObject, +}; +use crate::api::plugin::models::core::{ + PluginConfiguration, PluginUpdateAvailable, ScrobbleDetails, +}; +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::api::plugin::models::playlist::SpotubeFullPlaylistObject; +use crate::api::plugin::models::search::SpotubeSearchResponseObject; +use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::api::plugin::models::user::SpotubeUserObject; +use crate::api::plugin::plugin::OpaqueSender; +use anyhow::anyhow; +use flutter_rust_bridge::frb; +use tokio::sync::oneshot; + +pub struct PluginArtistSender {} + +impl PluginArtistSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn get_artist( + &self, + mpsc_tx: OpaqueSender, + id: String, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Artist(ArtistCommands::GetArtist { + id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn top_tracks( + &self, + mpsc_tx: OpaqueSender, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Artist(ArtistCommands::TopTracks { + id, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn albums( + &self, + mpsc_tx: OpaqueSender, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Artist(ArtistCommands::Albums { + id, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn related( + &self, + mpsc_tx: OpaqueSender, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Artist(ArtistCommands::Related { + id, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn save(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Artist(ArtistCommands::Save { + ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn unsave(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Artist(ArtistCommands::Unsave { + ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginAlbumSender {} + +impl PluginAlbumSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn get_album( + &self, + mpsc_tx: OpaqueSender, + id: String, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Album(AlbumCommands::GetAlbum { + id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn tracks( + &self, + mpsc_tx: OpaqueSender, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Album(AlbumCommands::Tracks { + id, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn releases( + &self, + mpsc_tx: OpaqueSender, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Album(AlbumCommands::Releases { + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn save(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Album(AlbumCommands::Save { + ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn unsave(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Album(AlbumCommands::Unsave { + ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginAudioSourceSender {} + +impl PluginAudioSourceSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn matches( + &self, + mpsc_tx: OpaqueSender, + track: SpotubeTrackObject, + ) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::AudioSource(AudioSourceCommands::Matches { + track, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn streams( + &self, + mpsc_tx: OpaqueSender, + matched: SpotubeAudioSourceMatchObject, + ) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::AudioSource(AudioSourceCommands::Streams { + matched, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginAuthSender {} + +impl PluginAuthSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn authenticate(&self, mpsc_tx: OpaqueSender) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Auth(AuthCommands::Authenticate { + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn logout(&self, mpsc_tx: OpaqueSender) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Auth(AuthCommands::Logout { + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn is_authenticated(&self, mpsc_tx: OpaqueSender) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Auth(AuthCommands::IsAuthenticated { + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginBrowseSender {} + +impl PluginBrowseSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn sections( + &self, + mpsc_tx: OpaqueSender, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Browse(BrowseCommands::Sections { + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn section_items( + &self, + mpsc_tx: OpaqueSender, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Browse(BrowseCommands::SectionItems { + id, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginCoreSender {} + +impl PluginCoreSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn check_update( + &self, + mpsc_tx: OpaqueSender, + plugin_config: PluginConfiguration, + ) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Core(CoreCommands::CheckUpdate { + plugin_config, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn support(&self, mpsc_tx: OpaqueSender) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Core(CoreCommands::Support { + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn scrobble( + &self, + mpsc_tx: OpaqueSender, + details: ScrobbleDetails, + ) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Core(CoreCommands::Scrobble { + details, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginPlaylistSender {} + +impl PluginPlaylistSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn get_playlist( + &self, + mpsc_tx: OpaqueSender, + id: String, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::GetPlaylist { + id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn tracks( + &self, + mpsc_tx: OpaqueSender, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::Tracks { + id, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn create_playlist( + &self, + mpsc_tx: OpaqueSender, + user_id: String, + name: String, + description: Option, + public: Option, + collaborative: Option, + ) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::CreatePlaylist { + user_id, + name, + description, + public, + collaborative, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn update_playlist( + &self, + mpsc_tx: OpaqueSender, + playlist_id: String, + name: Option, + description: Option, + public: Option, + collaborative: Option, + ) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::UpdatePlaylist { + playlist_id, + name, + description, + public, + collaborative, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn delete_playlist( + &self, + mpsc_tx: OpaqueSender, + playlist_id: String, + ) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::DeletePlaylist { + playlist_id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn add_tracks( + &self, + mpsc_tx: OpaqueSender, + playlist_id: String, + track_ids: Vec, + position: Option, + ) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::AddTracks { + playlist_id, + track_ids, + position, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn remove_tracks( + &self, + mpsc_tx: OpaqueSender, + playlist_id: String, + track_ids: Vec, + ) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::RemoveTracks { + playlist_id, + track_ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn save(&self, mpsc_tx: OpaqueSender, playlist_id: String) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::Save { + playlist_id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn unsave(&self, mpsc_tx: OpaqueSender, playlist_id: String) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Playlist(PlaylistCommands::Unsave { + playlist_id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginSearchSender {} + +impl PluginSearchSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn chips(&self, mpsc_tx: OpaqueSender) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Search(SearchCommands::Chips { + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn all( + &self, + mpsc_tx: OpaqueSender, + query: String, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Search(SearchCommands::All { + query, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn tracks( + &self, + mpsc_tx: OpaqueSender, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Search(SearchCommands::Tracks { + query, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn albums( + &self, + mpsc_tx: OpaqueSender, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Search(SearchCommands::Albums { + query, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn artists( + &self, + mpsc_tx: OpaqueSender, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Search(SearchCommands::Artists { + query, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn playlists( + &self, + mpsc_tx: OpaqueSender, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Search(SearchCommands::Playlists { + query, + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginTrackSender {} + +impl PluginTrackSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn get_track( + &self, + mpsc_tx: OpaqueSender, + id: String, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Track(TrackCommands::GetTrack { + id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn save(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Track(TrackCommands::Save { + ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn unsave(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Track(TrackCommands::Unsave { + ids, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn radio( + &self, + mpsc_tx: OpaqueSender, + id: String, + ) -> anyhow::Result> { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::Track(TrackCommands::Radio { + id, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} + +pub struct PluginUserSender {} + +impl PluginUserSender { + #[frb(ignore)] + pub fn new() -> Self { + Self {} + } + + pub async fn me(&self, mpsc_tx: OpaqueSender) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::User(UserCommands::Me { response_tx: tx })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn saved_tracks( + &self, + mpsc_tx: OpaqueSender, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::User(UserCommands::SavedTracks { + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn saved_albums( + &self, + mpsc_tx: OpaqueSender, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::User(UserCommands::SavedAlbums { + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn saved_artists( + &self, + mpsc_tx: OpaqueSender, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::User(UserCommands::SavedArtists { + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } + + pub async fn saved_playlists( + &self, + mpsc_tx: OpaqueSender, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let (tx, rx) = oneshot::channel(); + mpsc_tx + .sender + .send(PluginCommand::User(UserCommands::SavedPlaylists { + offset, + limit, + response_tx: tx, + })) + .await?; + + rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) + } +} diff --git a/rust/src/api/simple.rs b/rust/src/api/simple.rs deleted file mode 100644 index 4360c82a..00000000 --- a/rust/src/api/simple.rs +++ /dev/null @@ -1,10 +0,0 @@ -#[flutter_rust_bridge::frb(sync)] // Synchronous mode for simplicity of the demo -pub fn greet(name: String) -> String { - format!("Hello, {name}!") -} - -#[flutter_rust_bridge::frb(init)] -pub fn init_app() { - // Default utilities - feel free to customize - flutter_rust_bridge::setup_default_user_utils(); -} diff --git a/rust/src/frb_generated.rs b/rust/src/frb_generated.rs index 4f41c479..794d6cc0 100644 --- a/rust/src/frb_generated.rs +++ b/rust/src/frb_generated.rs @@ -25,19 +25,23 @@ // Section: imports +use crate::api::plugin::commands::*; +use crate::api::plugin::plugin::*; use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt}; use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; use flutter_rust_bridge::{Handler, IntoIntoDart}; // Section: boilerplate +use tokio::sync::mpsc::Sender; + flutter_rust_bridge::frb_generated_boilerplate!( default_stream_sink_codec = SseCodec, default_rust_opaque = RustOpaqueMoi, default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -1918914929; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -836755871; // Section: executor @@ -45,14 +49,14 @@ flutter_rust_bridge::frb_generated_default_handler!(); // Section: wire_funcs -fn wire__crate__api__simple__greet_impl( +fn wire__crate__api__plugin__plugin__OpaqueSender_auto_accessor_get_sender_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, data_len_: i32, ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { - debug_name: "greet", + debug_name: "OpaqueSender_auto_accessor_get_sender", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, @@ -66,16 +70,83 @@ fn wire__crate__api__simple__greet_impl( }; let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); - let api_name = ::sse_decode(&mut deserializer); + let api_that = , + >>::sse_decode(&mut deserializer); deserializer.end(); transform_result_sse::<_, ()>((move || { - let output_ok = Result::<_, ()>::Ok(crate::api::simple::greet(api_name))?; + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok(api_that_guard.sender.clone())?; Ok(output_ok) })()) }, ) } -fn wire__crate__api__simple__init_app_impl( +fn wire__crate__api__plugin__plugin__OpaqueSender_auto_accessor_set_sender_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "OpaqueSender_auto_accessor_set_sender", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_sender = >::sse_decode(&mut deserializer); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, true, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref_mut()), + _ => unreachable!(), + } + } + let mut api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + { + api_that_guard.sender = api_sender; + }; + })?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__init_app_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -101,7 +172,7 @@ fn wire__crate__api__simple__init_app_impl( move |context| { transform_result_sse::<_, ()>((move || { let output_ok = Result::<_, ()>::Ok({ - crate::api::simple::init_app(); + crate::api::init_app(); })?; Ok(output_ok) })()) @@ -109,9 +180,2317 @@ fn wire__crate__api__simple__init_app_impl( }, ) } +fn wire__crate__api__plugin__senders__plugin_album_sender_get_album_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_album_sender_get_album", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginAlbumSender::get_album( + &api_that, + api_mpsc_tx, + api_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_album_sender_releases_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_album_sender_releases", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginAlbumSender::releases( + &api_that, + api_mpsc_tx, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_album_sender_save_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_album_sender_save", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginAlbumSender::save( + &api_that, + api_mpsc_tx, + api_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_album_sender_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_album_sender_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginAlbumSender::tracks( + &api_that, + api_mpsc_tx, + api_id, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_album_sender_unsave_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_album_sender_unsave", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginAlbumSender::unsave( + &api_that, + api_mpsc_tx, + api_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_artist_sender_albums_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_artist_sender_albums", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginArtistSender::albums( + &api_that, + api_mpsc_tx, + api_id, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_artist_sender_get_artist_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_artist_sender_get_artist", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginArtistSender::get_artist( + &api_that, + api_mpsc_tx, + api_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_artist_sender_related_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_artist_sender_related", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginArtistSender::related( + &api_that, + api_mpsc_tx, + api_id, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_artist_sender_save_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_artist_sender_save", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginArtistSender::save( + &api_that, + api_mpsc_tx, + api_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_artist_sender_top_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_artist_sender_top_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginArtistSender::top_tracks( + &api_that, + api_mpsc_tx, + api_id, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_artist_sender_unsave_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_artist_sender_unsave", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginArtistSender::unsave( + &api_that, + api_mpsc_tx, + api_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_audio_source_sender_matches", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode( + &mut deserializer, + ); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_track = ::sse_decode( + &mut deserializer, + ); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginAudioSourceSender::matches( + &api_that, + api_mpsc_tx, + api_track, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_audio_source_sender_streams_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "plugin_audio_source_sender_streams", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer); +let api_mpsc_tx = ::sse_decode(&mut deserializer); +let api_matched = ::sse_decode(&mut deserializer);deserializer.end(); move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>((move || async move { + let output_ok = crate::api::plugin::senders::PluginAudioSourceSender::streams(&api_that, api_mpsc_tx, api_matched).await?; Ok(output_ok) + })().await) + } }) +} +fn wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_auth_sender_authenticate", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginAuthSender::authenticate( + &api_that, + api_mpsc_tx, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_auth_sender_is_authenticated", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginAuthSender::is_authenticated( + &api_that, + api_mpsc_tx, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_auth_sender_logout", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginAuthSender::logout( + &api_that, + api_mpsc_tx, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_browse_sender_section_items", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginBrowseSender::section_items( + &api_that, + api_mpsc_tx, + api_id, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_browse_sender_sections", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginBrowseSender::sections( + &api_that, + api_mpsc_tx, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__models__core__plugin_configuration_slug_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_configuration_slug", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode( + &mut deserializer, + ); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_, ()>::Ok( + crate::api::plugin::models::core::PluginConfiguration::slug(&api_that), + )?; + Ok(output_ok) + })()) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_core_sender_check_update", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_plugin_config = + ::sse_decode( + &mut deserializer, + ); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginCoreSender::check_update( + &api_that, + api_mpsc_tx, + api_plugin_config, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_core_sender_scrobble", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_details = + ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginCoreSender::scrobble( + &api_that, + api_mpsc_tx, + api_details, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_core_sender_support_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_core_sender_support", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginCoreSender::support( + &api_that, + api_mpsc_tx, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_add_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_playlist_id = ::sse_decode(&mut deserializer); + let api_track_ids = >::sse_decode(&mut deserializer); + let api_position = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginPlaylistSender::add_tracks( + &api_that, + api_mpsc_tx, + api_playlist_id, + api_track_ids, + api_position, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_create_playlist", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_user_id = ::sse_decode(&mut deserializer); + let api_name = ::sse_decode(&mut deserializer); + let api_description = >::sse_decode(&mut deserializer); + let api_public = >::sse_decode(&mut deserializer); + let api_collaborative = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginPlaylistSender::create_playlist( + &api_that, + api_mpsc_tx, + api_user_id, + api_name, + api_description, + api_public, + api_collaborative, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_delete_playlist", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_playlist_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginPlaylistSender::delete_playlist( + &api_that, + api_mpsc_tx, + api_playlist_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_get_playlist", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginPlaylistSender::get_playlist( + &api_that, + api_mpsc_tx, + api_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_remove_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_playlist_id = ::sse_decode(&mut deserializer); + let api_track_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginPlaylistSender::remove_tracks( + &api_that, + api_mpsc_tx, + api_playlist_id, + api_track_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_save", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_playlist_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginPlaylistSender::save( + &api_that, + api_mpsc_tx, + api_playlist_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginPlaylistSender::tracks( + &api_that, + api_mpsc_tx, + api_id, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_unsave", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_playlist_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginPlaylistSender::unsave( + &api_that, + api_mpsc_tx, + api_playlist_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_playlist_sender_update_playlist", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_playlist_id = ::sse_decode(&mut deserializer); + let api_name = >::sse_decode(&mut deserializer); + let api_description = >::sse_decode(&mut deserializer); + let api_public = >::sse_decode(&mut deserializer); + let api_collaborative = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginPlaylistSender::update_playlist( + &api_that, + api_mpsc_tx, + api_playlist_id, + api_name, + api_description, + api_public, + api_collaborative, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_search_sender_albums_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_search_sender_albums", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_query = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginSearchSender::albums( + &api_that, + api_mpsc_tx, + api_query, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_search_sender_all_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_search_sender_all", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_query = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginSearchSender::all( + &api_that, + api_mpsc_tx, + api_query, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_search_sender_artists_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_search_sender_artists", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_query = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginSearchSender::artists( + &api_that, + api_mpsc_tx, + api_query, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_search_sender_chips_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_search_sender_chips", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginSearchSender::chips( + &api_that, + api_mpsc_tx, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_search_sender_playlists", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_query = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginSearchSender::playlists( + &api_that, + api_mpsc_tx, + api_query, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_search_sender_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_query = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginSearchSender::tracks( + &api_that, + api_mpsc_tx, + api_query, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_track_sender_get_track", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginTrackSender::get_track( + &api_that, + api_mpsc_tx, + api_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_track_sender_radio_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_track_sender_radio", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginTrackSender::radio( + &api_that, + api_mpsc_tx, + api_id, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_track_sender_save_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_track_sender_save", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginTrackSender::save( + &api_that, + api_mpsc_tx, + api_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_track_sender_unsave", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_ids = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginTrackSender::unsave( + &api_that, + api_mpsc_tx, + api_ids, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_user_sender_me_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_user_sender_me", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = crate::api::plugin::senders::PluginUserSender::me( + &api_that, + api_mpsc_tx, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_user_sender_saved_albums", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginUserSender::saved_albums( + &api_that, + api_mpsc_tx, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_user_sender_saved_artists", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginUserSender::saved_artists( + &api_that, + api_mpsc_tx, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_user_sender_saved_playlists", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginUserSender::saved_playlists( + &api_that, + api_mpsc_tx, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "plugin_user_sender_saved_tracks", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_offset = >::sse_decode(&mut deserializer); + let api_limit = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::senders::PluginUserSender::saved_tracks( + &api_that, + api_mpsc_tx, + api_offset, + api_limit, + ) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "spotube_audio_lossless_container_quality_to_string_fmt", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer);deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_,()>::Ok(crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality::to_string_fmt(&api_that))?; Ok(output_ok) + })()) }) +} +fn wire__crate__api__plugin__models__audio_source__spotube_audio_lossy_container_quality_to_string_fmt_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "spotube_audio_lossy_container_quality_to_string_fmt", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer);deserializer.end(); move |context| { + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_,()>::Ok(crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality::to_string_fmt(&api_that))?; Ok(output_ok) + })()) + } }) +} +fn wire__crate__api__plugin__models__audio_source__spotube_audio_source_container_preset_file_extension_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "spotube_audio_source_container_preset_file_extension", port: None, mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync }, move || { + let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) }; + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = ::sse_decode(&mut deserializer);deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = Result::<_,()>::Ok(crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::file_extension(&api_that))?; Ok(output_ok) + })()) }) +} +fn wire__crate__api__plugin__plugin__spotube_plugin_dispose_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "spotube_plugin_dispose", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = + ::sse_decode(&mut deserializer); + let api_tx = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::plugin::plugin::SpotubePlugin::dispose(&api_that, api_tx) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__plugin__plugin__spotube_plugin_new_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "spotube_plugin_new", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + deserializer.end(); + transform_result_sse::<_, ()>((move || { + let output_ok = + Result::<_, ()>::Ok(crate::api::plugin::plugin::SpotubePlugin::new())?; + Ok(output_ok) + })()) + }, + ) +} +fn wire__crate__api__plugin__plugin__spotube_plugin_new_context_impl( + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "spotube_plugin_new_context", + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_plugin_script = ::sse_decode(&mut deserializer); + let api_plugin_config = + ::sse_decode( + &mut deserializer, + ); + deserializer.end(); + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || { + let output_ok = crate::api::plugin::plugin::SpotubePlugin::new_context( + api_plugin_script, + api_plugin_config, + )?; + Ok(output_ok) + })(), + ) + }, + ) +} + +// Section: related_funcs + +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner +); +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); // Section: dart2rust +impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::anyhow::anyhow!("{}", inner); + } +} + +impl SseDecode for OpaqueSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for PluginCommand { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = , + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode for Sender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + impl SseDecode for String { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -120,6 +2499,72 @@ impl SseDecode for String { } } +impl SseDecode for bool { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u8().unwrap() != 0 + } +} + +impl SseDecode for f64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_f64::().unwrap() + } +} + +impl SseDecode for i32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i32::().unwrap() + } +} + +impl SseDecode for i64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i64::().unwrap() + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode( + deserializer, + )); + } + return ans_; + } +} + impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -132,6 +2577,1111 @@ impl SseDecode for Vec { } } +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode( + deserializer, + ), + ); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode(deserializer), + ); + } + return ans_; + } +} + +impl SseDecode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(::sse_decode(deserializer)); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode( + deserializer, + ), + ); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode( + deserializer, + ), + ); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode( + deserializer, + ), + ); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode(deserializer), + ); + } + return ans_; + } +} + +impl SseDecode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push( + ::sse_decode(deserializer), + ); + } + return ans_; + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode(deserializer), + ); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some( + ::sse_decode( + deserializer, + ), + ); + } else { + return None; + } + } +} + +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(>::sse_decode(deserializer)); + } else { + return None; + } + } +} + +impl SseDecode for Option> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some( + >::sse_decode( + deserializer, + ), + ); + } else { + return None; + } + } +} + +impl SseDecode for crate::api::plugin::models::core::PluginAbility { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::plugin::models::core::PluginAbility::Authentication, + 1 => crate::api::plugin::models::core::PluginAbility::Scrobbling, + 2 => crate::api::plugin::models::core::PluginAbility::Metadata, + 3 => crate::api::plugin::models::core::PluginAbility::AudioSource, + _ => unreachable!("Invalid variant for PluginAbility: {}", inner), + }; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginAlbumSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginAlbumSender {}; + } +} + +impl SseDecode for crate::api::plugin::models::core::PluginApi { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::plugin::models::core::PluginApi::Webview, + 1 => crate::api::plugin::models::core::PluginApi::Localstorage, + 2 => crate::api::plugin::models::core::PluginApi::Timezone, + _ => unreachable!("Invalid variant for PluginApi: {}", inner), + }; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginArtistSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginArtistSender {}; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginAudioSourceSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginAudioSourceSender {}; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginAuthSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginAuthSender {}; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginBrowseSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginBrowseSender {}; + } +} + +impl SseDecode for crate::api::plugin::models::core::PluginConfiguration { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_name = ::sse_decode(deserializer); + let mut var_description = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_author = ::sse_decode(deserializer); + let mut var_entryPoint = ::sse_decode(deserializer); + let mut var_pluginApiVersion = ::sse_decode(deserializer); + let mut var_apis = + >::sse_decode(deserializer); + let mut var_abilities = + >::sse_decode(deserializer); + let mut var_repository = >::sse_decode(deserializer); + return crate::api::plugin::models::core::PluginConfiguration { + name: var_name, + description: var_description, + version: var_version, + author: var_author, + entry_point: var_entryPoint, + plugin_api_version: var_pluginApiVersion, + apis: var_apis, + abilities: var_abilities, + repository: var_repository, + }; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginCoreSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginCoreSender {}; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginPlaylistSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginPlaylistSender {}; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginSearchSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginSearchSender {}; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginTrackSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginTrackSender {}; + } +} + +impl SseDecode for crate::api::plugin::models::core::PluginUpdateAvailable { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_downloadUrl = ::sse_decode(deserializer); + let mut var_version = ::sse_decode(deserializer); + let mut var_changelog = >::sse_decode(deserializer); + return crate::api::plugin::models::core::PluginUpdateAvailable { + download_url: var_downloadUrl, + version: var_version, + changelog: var_changelog, + }; + } +} + +impl SseDecode for crate::api::plugin::senders::PluginUserSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + return crate::api::plugin::senders::PluginUserSender {}; + } +} + +impl SseDecode for crate::api::plugin::models::core::ScrobbleAlbum { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + return crate::api::plugin::models::core::ScrobbleAlbum { + id: var_id, + name: var_name, + }; + } +} + +impl SseDecode for crate::api::plugin::models::core::ScrobbleArtist { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + return crate::api::plugin::models::core::ScrobbleArtist { + id: var_id, + name: var_name, + }; + } +} + +impl SseDecode for crate::api::plugin::models::core::ScrobbleDetails { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_id = ::sse_decode(deserializer); + let mut var_title = ::sse_decode(deserializer); + let mut var_artists = + >::sse_decode(deserializer); + let mut var_album = + ::sse_decode(deserializer); + let mut var_timestamp = >::sse_decode(deserializer); + let mut var_durationMs = >::sse_decode(deserializer); + let mut var_isrc = >::sse_decode(deserializer); + return crate::api::plugin::models::core::ScrobbleDetails { + id: var_id, + title: var_title, + artists: var_artists, + album: var_album, + timestamp: var_timestamp, + duration_ms: var_durationMs, + isrc: var_isrc, + }; + } +} + +impl SseDecode for crate::api::plugin::models::album::SpotubeAlbumType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::plugin::models::album::SpotubeAlbumType::Album, + 1 => crate::api::plugin::models::album::SpotubeAlbumType::Single, + 2 => crate::api::plugin::models::album::SpotubeAlbumType::Compilation, + _ => unreachable!("Invalid variant for SpotubeAlbumType: {}", inner), + }; + } +} + +impl SseDecode for crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_bitDepth = ::sse_decode(deserializer); + let mut var_sampleRate = ::sse_decode(deserializer); + return crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality { + bit_depth: var_bitDepth, + sample_rate: var_sampleRate, + }; + } +} + +impl SseDecode for crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_bitrate = ::sse_decode(deserializer); + return crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality { + bitrate: var_bitrate, + }; + } +} + +impl SseDecode for crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_compressionType = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_qualities = >::sse_decode(deserializer); + return crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::Lossy{compression_type: var_compressionType, name: var_name, qualities: var_qualities}; + } + 1 => { + let mut var_compressionType = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_qualities = >::sse_decode(deserializer); + return crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::Lossless{compression_type: var_compressionType, name: var_name, qualities: var_qualities}; + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_title = ::sse_decode(deserializer); + let mut var_artists = >::sse_decode(deserializer); + let mut var_duration = ::sse_decode(deserializer); + let mut var_thumbnail = >::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + return crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject { + type_name: var_typeName, + id: var_id, + title: var_title, + artists: var_artists, + duration: var_duration, + thumbnail: var_thumbnail, + external_uri: var_externalUri, + }; + } +} + +impl SseDecode for crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_url = ::sse_decode(deserializer); + let mut var_container = ::sse_decode(deserializer); + let mut var_compressionType = + ::sse_decode( + deserializer, + ); + let mut var_codec = >::sse_decode(deserializer); + let mut var_bitrate = >::sse_decode(deserializer); + let mut var_bitDepth = >::sse_decode(deserializer); + let mut var_sampleRate = >::sse_decode(deserializer); + return crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject { + type_name: var_typeName, + url: var_url, + container: var_container, + compression_type: var_compressionType, + codec: var_codec, + bitrate: var_bitrate, + bit_depth: var_bitDepth, + sample_rate: var_sampleRate, + }; + } +} + +impl SseDecode for crate::api::plugin::models::browse::SpotubeBrowseSectionObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_title = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_browseMore = ::sse_decode(deserializer); + let mut var_items = >::sse_decode(deserializer); + return crate::api::plugin::models::browse::SpotubeBrowseSectionObject { + type_name: var_typeName, + id: var_id, + title: var_title, + external_uri: var_externalUri, + browse_more: var_browseMore, + items: var_items, + }; + } +} + +impl SseDecode for crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::Track(var_field0); + } + 1 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistFull(var_field0); + } + 2 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistSimple(var_field0); + } + 3 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::AlbumSimple(var_field0); + } + 4 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::AlbumFull(var_field0); + } + 5 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::ArtistFull(var_field0); + } + 6 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::ArtistSimple(var_field0); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::api::plugin::models::album::SpotubeFullAlbumObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_artists = + >::sse_decode( + deserializer, + ); + let mut var_images = + >::sse_decode(deserializer); + let mut var_releaseDate = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_totalTracks = ::sse_decode(deserializer); + let mut var_albumType = + ::sse_decode(deserializer); + let mut var_recordLabel = >::sse_decode(deserializer); + let mut var_genres = >>::sse_decode(deserializer); + return crate::api::plugin::models::album::SpotubeFullAlbumObject { + type_name: var_typeName, + id: var_id, + name: var_name, + artists: var_artists, + images: var_images, + release_date: var_releaseDate, + external_uri: var_externalUri, + total_tracks: var_totalTracks, + album_type: var_albumType, + record_label: var_recordLabel, + genres: var_genres, + }; + } +} + +impl SseDecode for crate::api::plugin::models::artist::SpotubeFullArtistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_images = + >::sse_decode(deserializer); + let mut var_genres = >>::sse_decode(deserializer); + let mut var_followers = >::sse_decode(deserializer); + return crate::api::plugin::models::artist::SpotubeFullArtistObject { + type_name: var_typeName, + id: var_id, + name: var_name, + external_uri: var_externalUri, + images: var_images, + genres: var_genres, + followers: var_followers, + }; + } +} + +impl SseDecode for crate::api::plugin::models::playlist::SpotubeFullPlaylistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_description = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_owner = + ::sse_decode(deserializer); + let mut var_images = + >::sse_decode(deserializer); + let mut var_collaborators = + >::sse_decode(deserializer); + let mut var_collaborative = ::sse_decode(deserializer); + let mut var_public = ::sse_decode(deserializer); + return crate::api::plugin::models::playlist::SpotubeFullPlaylistObject { + type_name: var_typeName, + id: var_id, + name: var_name, + description: var_description, + external_uri: var_externalUri, + owner: var_owner, + images: var_images, + collaborators: var_collaborators, + collaborative: var_collaborative, + public: var_public, + }; + } +} + +impl SseDecode for crate::api::plugin::models::image::SpotubeImageObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_url = ::sse_decode(deserializer); + let mut var_width = >::sse_decode(deserializer); + let mut var_height = >::sse_decode(deserializer); + return crate::api::plugin::models::image::SpotubeImageObject { + type_name: var_typeName, + url: var_url, + width: var_width, + height: var_height, + }; + } +} + +impl SseDecode for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return match inner { + 0 => crate::api::plugin::models::audio_source::SpotubeMediaCompressionType::Lossy, + 1 => crate::api::plugin::models::audio_source::SpotubeMediaCompressionType::Lossless, + _ => unreachable!("Invalid variant for SpotubeMediaCompressionType: {}", inner), + }; + } +} + +impl SseDecode for crate::api::plugin::models::pagination::SpotubePaginationResponseObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_limit = ::sse_decode(deserializer); + let mut var_nextOffset = >::sse_decode(deserializer); + let mut var_total = ::sse_decode(deserializer); + let mut var_hasMore = ::sse_decode(deserializer); + let mut var_items = >::sse_decode(deserializer); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObject { + limit: var_limit, + next_offset: var_nextOffset, + total: var_total, + has_more: var_hasMore, + items: var_items, + }; + } +} + +impl SseDecode for crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::Track(var_field0); + } + 1 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistFull(var_field0); + } + 2 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistSimple(var_field0); + } + 3 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::AlbumSimple(var_field0); + } + 4 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::AlbumFull(var_field0); + } + 5 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::ArtistFull(var_field0); + } + 6 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::ArtistSimple(var_field0); + } + 7 => { + let mut var_field0 = + ::sse_decode( + deserializer, + ); + return crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::BrowseSection(var_field0); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::api::plugin::plugin::SpotubePlugin { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_artist = + ::sse_decode(deserializer); + let mut var_album = + ::sse_decode(deserializer); + let mut var_audioSource = + ::sse_decode(deserializer); + let mut var_auth = + ::sse_decode(deserializer); + let mut var_browse = + ::sse_decode(deserializer); + let mut var_core = + ::sse_decode(deserializer); + let mut var_playlist = + ::sse_decode(deserializer); + let mut var_search = + ::sse_decode(deserializer); + let mut var_track = + ::sse_decode(deserializer); + let mut var_user = + ::sse_decode(deserializer); + return crate::api::plugin::plugin::SpotubePlugin { + artist: var_artist, + album: var_album, + audio_source: var_audioSource, + auth: var_auth, + browse: var_browse, + core: var_core, + playlist: var_playlist, + search: var_search, + track: var_track, + user: var_user, + }; + } +} + +impl SseDecode for crate::api::plugin::models::search::SpotubeSearchResponseObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_albums = + >::sse_decode( + deserializer, + ); + let mut var_artists = + >::sse_decode( + deserializer, + ); + let mut var_playlists = >::sse_decode(deserializer); + let mut var_tracks = + >::sse_decode(deserializer); + return crate::api::plugin::models::search::SpotubeSearchResponseObject { + type_name: var_typeName, + albums: var_albums, + artists: var_artists, + playlists: var_playlists, + tracks: var_tracks, + }; + } +} + +impl SseDecode for crate::api::plugin::models::album::SpotubeSimpleAlbumObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_artists = + >::sse_decode( + deserializer, + ); + let mut var_images = + >::sse_decode(deserializer); + let mut var_albumType = + ::sse_decode(deserializer); + let mut var_releaseDate = >::sse_decode(deserializer); + return crate::api::plugin::models::album::SpotubeSimpleAlbumObject { + type_name: var_typeName, + id: var_id, + name: var_name, + external_uri: var_externalUri, + artists: var_artists, + images: var_images, + album_type: var_albumType, + release_date: var_releaseDate, + }; + } +} + +impl SseDecode for crate::api::plugin::models::artist::SpotubeSimpleArtistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_images = + >>::sse_decode( + deserializer, + ); + return crate::api::plugin::models::artist::SpotubeSimpleArtistObject { + type_name: var_typeName, + id: var_id, + name: var_name, + external_uri: var_externalUri, + images: var_images, + }; + } +} + +impl SseDecode for crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_description = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_owner = + ::sse_decode(deserializer); + let mut var_images = + >::sse_decode(deserializer); + return crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject { + type_name: var_typeName, + id: var_id, + name: var_name, + description: var_description, + external_uri: var_externalUri, + owner: var_owner, + images: var_images, + }; + } +} + +impl SseDecode for crate::api::plugin::models::track::SpotubeTrackObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + let mut var_artists = + >::sse_decode( + deserializer, + ); + let mut var_album = + ::sse_decode(deserializer); + let mut var_durationMs = ::sse_decode(deserializer); + let mut var_isrc = ::sse_decode(deserializer); + let mut var_explicit = ::sse_decode(deserializer); + return crate::api::plugin::models::track::SpotubeTrackObject { + type_name: var_typeName, + id: var_id, + name: var_name, + external_uri: var_externalUri, + artists: var_artists, + album: var_album, + duration_ms: var_durationMs, + isrc: var_isrc, + explicit: var_explicit, + }; + } +} + +impl SseDecode for crate::api::plugin::models::user::SpotubeUserObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_typeName = ::sse_decode(deserializer); + let mut var_id = ::sse_decode(deserializer); + let mut var_name = ::sse_decode(deserializer); + let mut var_images = + >::sse_decode(deserializer); + let mut var_externalUri = ::sse_decode(deserializer); + return crate::api::plugin::models::user::SpotubeUserObject { + type_name: var_typeName, + id: var_id, + name: var_name, + images: var_images, + external_uri: var_externalUri, + }; + } +} + +impl SseDecode for u32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u32::().unwrap() + } +} + +impl SseDecode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u64::().unwrap() + } +} + impl SseDecode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -144,17 +3694,10 @@ impl SseDecode for () { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {} } -impl SseDecode for i32 { +impl SseDecode for usize { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_i32::().unwrap() - } -} - -impl SseDecode for bool { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { - deserializer.cursor.read_u8().unwrap() != 0 + deserializer.cursor.read_u64::().unwrap() as _ } } @@ -167,9 +3710,57 @@ fn pde_ffi_dispatcher_primary_impl( ) { // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { - 2 => wire__crate__api__simple__init_app_impl(port, ptr, rust_vec_len, data_len), - _ => unreachable!(), - } + 3 => wire__crate__api__init_app_impl(port, ptr, rust_vec_len, data_len), +4 => wire__crate__api__plugin__senders__plugin_album_sender_get_album_impl(port, ptr, rust_vec_len, data_len), +5 => wire__crate__api__plugin__senders__plugin_album_sender_releases_impl(port, ptr, rust_vec_len, data_len), +6 => wire__crate__api__plugin__senders__plugin_album_sender_save_impl(port, ptr, rust_vec_len, data_len), +7 => wire__crate__api__plugin__senders__plugin_album_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +8 => wire__crate__api__plugin__senders__plugin_album_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +9 => wire__crate__api__plugin__senders__plugin_artist_sender_albums_impl(port, ptr, rust_vec_len, data_len), +10 => wire__crate__api__plugin__senders__plugin_artist_sender_get_artist_impl(port, ptr, rust_vec_len, data_len), +11 => wire__crate__api__plugin__senders__plugin_artist_sender_related_impl(port, ptr, rust_vec_len, data_len), +12 => wire__crate__api__plugin__senders__plugin_artist_sender_save_impl(port, ptr, rust_vec_len, data_len), +13 => wire__crate__api__plugin__senders__plugin_artist_sender_top_tracks_impl(port, ptr, rust_vec_len, data_len), +14 => wire__crate__api__plugin__senders__plugin_artist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +15 => wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl(port, ptr, rust_vec_len, data_len), +16 => wire__crate__api__plugin__senders__plugin_audio_source_sender_streams_impl(port, ptr, rust_vec_len, data_len), +17 => wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl(port, ptr, rust_vec_len, data_len), +18 => wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl(port, ptr, rust_vec_len, data_len), +19 => wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl(port, ptr, rust_vec_len, data_len), +20 => wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl(port, ptr, rust_vec_len, data_len), +21 => wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl(port, ptr, rust_vec_len, data_len), +22 => wire__crate__api__plugin__models__core__plugin_configuration_slug_impl(port, ptr, rust_vec_len, data_len), +23 => wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl(port, ptr, rust_vec_len, data_len), +24 => wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl(port, ptr, rust_vec_len, data_len), +25 => wire__crate__api__plugin__senders__plugin_core_sender_support_impl(port, ptr, rust_vec_len, data_len), +26 => wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl(port, ptr, rust_vec_len, data_len), +27 => wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_impl(port, ptr, rust_vec_len, data_len), +28 => wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_impl(port, ptr, rust_vec_len, data_len), +29 => wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl(port, ptr, rust_vec_len, data_len), +30 => wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl(port, ptr, rust_vec_len, data_len), +31 => wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl(port, ptr, rust_vec_len, data_len), +32 => wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +33 => wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +34 => wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_impl(port, ptr, rust_vec_len, data_len), +35 => wire__crate__api__plugin__senders__plugin_search_sender_albums_impl(port, ptr, rust_vec_len, data_len), +36 => wire__crate__api__plugin__senders__plugin_search_sender_all_impl(port, ptr, rust_vec_len, data_len), +37 => wire__crate__api__plugin__senders__plugin_search_sender_artists_impl(port, ptr, rust_vec_len, data_len), +38 => wire__crate__api__plugin__senders__plugin_search_sender_chips_impl(port, ptr, rust_vec_len, data_len), +39 => wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl(port, ptr, rust_vec_len, data_len), +40 => wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +41 => wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl(port, ptr, rust_vec_len, data_len), +42 => wire__crate__api__plugin__senders__plugin_track_sender_radio_impl(port, ptr, rust_vec_len, data_len), +43 => wire__crate__api__plugin__senders__plugin_track_sender_save_impl(port, ptr, rust_vec_len, data_len), +44 => wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +45 => wire__crate__api__plugin__senders__plugin_user_sender_me_impl(port, ptr, rust_vec_len, data_len), +46 => wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl(port, ptr, rust_vec_len, data_len), +47 => wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl(port, ptr, rust_vec_len, data_len), +48 => wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl(port, ptr, rust_vec_len, data_len), +49 => wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl(port, ptr, rust_vec_len, data_len), +51 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossy_container_quality_to_string_fmt_impl(port, ptr, rust_vec_len, data_len), +53 => wire__crate__api__plugin__plugin__spotube_plugin_dispose_impl(port, ptr, rust_vec_len, data_len), + _ => unreachable!(), + } } fn pde_ffi_dispatcher_sync_impl( @@ -180,13 +3771,1105 @@ fn pde_ffi_dispatcher_sync_impl( ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { - 1 => wire__crate__api__simple__greet_impl(ptr, rust_vec_len, data_len), - _ => unreachable!(), - } + 1 => wire__crate__api__plugin__plugin__OpaqueSender_auto_accessor_get_sender_impl(ptr, rust_vec_len, data_len), +2 => wire__crate__api__plugin__plugin__OpaqueSender_auto_accessor_set_sender_impl(ptr, rust_vec_len, data_len), +50 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl(ptr, rust_vec_len, data_len), +52 => wire__crate__api__plugin__models__audio_source__spotube_audio_source_container_preset_file_extension_impl(ptr, rust_vec_len, data_len), +54 => wire__crate__api__plugin__plugin__spotube_plugin_new_impl(ptr, rust_vec_len, data_len), +55 => wire__crate__api__plugin__plugin__spotube_plugin_new_context_impl(ptr, rust_vec_len, data_len), + _ => unreachable!(), + } } // Section: rust2dart +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for OpaqueSender { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for FrbWrapper {} + +impl flutter_rust_bridge::IntoIntoDart> for PluginCommand { + fn into_into_dart(self) -> FrbWrapper { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} + +impl flutter_rust_bridge::IntoIntoDart>> + for Sender +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() + } +} + +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::PluginAbility { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Authentication => 0.into_dart(), + Self::Scrobbling => 1.into_dart(), + Self::Metadata => 2.into_dart(), + Self::AudioSource => 3.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::PluginAbility +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::PluginAbility +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::PluginAbility { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginAlbumSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginAlbumSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginAlbumSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginAlbumSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::PluginApi { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Webview => 0.into_dart(), + Self::Localstorage => 1.into_dart(), + Self::Timezone => 2.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::PluginApi +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::PluginApi +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::PluginApi { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginArtistSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginArtistSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginArtistSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginArtistSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginAudioSourceSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginAudioSourceSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginAudioSourceSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginAudioSourceSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginAuthSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginAuthSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginAuthSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginAuthSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginBrowseSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginBrowseSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginBrowseSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginBrowseSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::PluginConfiguration { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.name.into_into_dart().into_dart(), + self.description.into_into_dart().into_dart(), + self.version.into_into_dart().into_dart(), + self.author.into_into_dart().into_dart(), + self.entry_point.into_into_dart().into_dart(), + self.plugin_api_version.into_into_dart().into_dart(), + self.apis.into_into_dart().into_dart(), + self.abilities.into_into_dart().into_dart(), + self.repository.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::PluginConfiguration +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::PluginConfiguration +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::PluginConfiguration { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginCoreSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginCoreSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginCoreSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginCoreSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginPlaylistSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginPlaylistSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginPlaylistSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginPlaylistSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginSearchSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginSearchSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginSearchSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginSearchSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginTrackSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginTrackSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginTrackSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginTrackSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::PluginUpdateAvailable { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.download_url.into_into_dart().into_dart(), + self.version.into_into_dart().into_dart(), + self.changelog.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::PluginUpdateAvailable +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::PluginUpdateAvailable +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::PluginUpdateAvailable { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::senders::PluginUserSender { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + Vec::::new().into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::senders::PluginUserSender +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::senders::PluginUserSender +{ + fn into_into_dart(self) -> crate::api::plugin::senders::PluginUserSender { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::ScrobbleAlbum { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::ScrobbleAlbum +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::ScrobbleAlbum +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::ScrobbleAlbum { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::ScrobbleArtist { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::ScrobbleArtist +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::ScrobbleArtist +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::ScrobbleArtist { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::core::ScrobbleDetails { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.id.into_into_dart().into_dart(), + self.title.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.album.into_into_dart().into_dart(), + self.timestamp.into_into_dart().into_dart(), + self.duration_ms.into_into_dart().into_dart(), + self.isrc.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::core::ScrobbleDetails +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::core::ScrobbleDetails +{ + fn into_into_dart(self) -> crate::api::plugin::models::core::ScrobbleDetails { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::album::SpotubeAlbumType { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Album => 0.into_dart(), + Self::Single => 1.into_dart(), + Self::Compilation => 2.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::album::SpotubeAlbumType +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::album::SpotubeAlbumType +{ + fn into_into_dart(self) -> crate::api::plugin::models::album::SpotubeAlbumType { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.bit_depth.into_into_dart().into_dart(), + self.sample_rate.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality, + > for crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.bitrate.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality, + > for crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self {crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::Lossy{compression_type,name,qualities} => { [0.into_dart(), +compression_type.into_into_dart().into_dart(), +name.into_into_dart().into_dart(), +qualities.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::Lossless{compression_type,name,qualities} => { [1.into_dart(), +compression_type.into_into_dart().into_dart(), +name.into_into_dart().into_dart(), +qualities.into_into_dart().into_dart()].into_dart() } + _ => { unimplemented!(""); }} + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset, + > for crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.title.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.duration.into_into_dart().into_dart(), + self.thumbnail.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject, + > for crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.url.into_into_dart().into_dart(), + self.container.into_into_dart().into_dart(), + self.compression_type.into_into_dart().into_dart(), + self.codec.into_into_dart().into_dart(), + self.bitrate.into_into_dart().into_dart(), + self.bit_depth.into_into_dart().into_dart(), + self.sample_rate.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject, + > for crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::browse::SpotubeBrowseSectionObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.title.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.browse_more.into_into_dart().into_dart(), + self.items.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::browse::SpotubeBrowseSectionObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::browse::SpotubeBrowseSectionObject, + > for crate::api::plugin::models::browse::SpotubeBrowseSectionObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::browse::SpotubeBrowseSectionObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self {crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::Track(field0) => { [0.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistFull(field0) => { [1.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistSimple(field0) => { [2.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::AlbumSimple(field0) => { [3.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::AlbumFull(field0) => { [4.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::ArtistFull(field0) => { [5.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::ArtistSimple(field0) => { [6.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } + _ => { unimplemented!(""); }} + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem, + > for crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::album::SpotubeFullAlbumObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + self.release_date.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.total_tracks.into_into_dart().into_dart(), + self.album_type.into_into_dart().into_dart(), + self.record_label.into_into_dart().into_dart(), + self.genres.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::album::SpotubeFullAlbumObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::album::SpotubeFullAlbumObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::album::SpotubeFullAlbumObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::artist::SpotubeFullArtistObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + self.genres.into_into_dart().into_dart(), + self.followers.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::artist::SpotubeFullArtistObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::artist::SpotubeFullArtistObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::artist::SpotubeFullArtistObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::playlist::SpotubeFullPlaylistObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.description.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.owner.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + self.collaborators.into_into_dart().into_dart(), + self.collaborative.into_into_dart().into_dart(), + self.public.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::playlist::SpotubeFullPlaylistObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::playlist::SpotubeFullPlaylistObject, + > for crate::api::plugin::models::playlist::SpotubeFullPlaylistObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::playlist::SpotubeFullPlaylistObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::image::SpotubeImageObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.url.into_into_dart().into_dart(), + self.width.into_into_dart().into_dart(), + self.height.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::image::SpotubeImageObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::image::SpotubeImageObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::image::SpotubeImageObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + Self::Lossy => 0.into_dart(), + Self::Lossless => 1.into_dart(), + _ => unreachable!(), + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::audio_source::SpotubeMediaCompressionType, + > for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::audio_source::SpotubeMediaCompressionType { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::pagination::SpotubePaginationResponseObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.limit.into_into_dart().into_dart(), + self.next_offset.into_into_dart().into_dart(), + self.total.into_into_dart().into_dart(), + self.has_more.into_into_dart().into_dart(), + self.items.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::pagination::SpotubePaginationResponseObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::pagination::SpotubePaginationResponseObject, + > for crate::api::plugin::models::pagination::SpotubePaginationResponseObject +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::pagination::SpotubePaginationResponseObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self {crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::Track(field0) => { [0.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistFull(field0) => { [1.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistSimple(field0) => { [2.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::AlbumSimple(field0) => { [3.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::AlbumFull(field0) => { [4.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::ArtistFull(field0) => { [5.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::ArtistSimple(field0) => { [6.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::BrowseSection(field0) => { [7.into_dart(), +field0.into_into_dart().into_dart()].into_dart() } + _ => { unimplemented!(""); }} + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem, + > for crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem +{ + fn into_into_dart( + self, + ) -> crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::plugin::SpotubePlugin { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.artist.into_into_dart().into_dart(), + self.album.into_into_dart().into_dart(), + self.audio_source.into_into_dart().into_dart(), + self.auth.into_into_dart().into_dart(), + self.browse.into_into_dart().into_dart(), + self.core.into_into_dart().into_dart(), + self.playlist.into_into_dart().into_dart(), + self.search.into_into_dart().into_dart(), + self.track.into_into_dart().into_dart(), + self.user.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::plugin::SpotubePlugin +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::plugin::SpotubePlugin +{ + fn into_into_dart(self) -> crate::api::plugin::plugin::SpotubePlugin { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::search::SpotubeSearchResponseObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.albums.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.playlists.into_into_dart().into_dart(), + self.tracks.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::search::SpotubeSearchResponseObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::search::SpotubeSearchResponseObject, + > for crate::api::plugin::models::search::SpotubeSearchResponseObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::search::SpotubeSearchResponseObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::album::SpotubeSimpleAlbumObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + self.album_type.into_into_dart().into_dart(), + self.release_date.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::album::SpotubeSimpleAlbumObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::album::SpotubeSimpleAlbumObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::album::SpotubeSimpleAlbumObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::artist::SpotubeSimpleArtistObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::artist::SpotubeSimpleArtistObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::artist::SpotubeSimpleArtistObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::artist::SpotubeSimpleArtistObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart + for crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject +{ + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.description.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.owner.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject +{ +} +impl + flutter_rust_bridge::IntoIntoDart< + crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject, + > for crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::track::SpotubeTrackObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + self.artists.into_into_dart().into_dart(), + self.album.into_into_dart().into_dart(), + self.duration_ms.into_into_dart().into_dart(), + self.isrc.into_into_dart().into_dart(), + self.explicit.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::track::SpotubeTrackObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::track::SpotubeTrackObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::track::SpotubeTrackObject { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::api::plugin::models::user::SpotubeUserObject { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [ + self.type_name.into_into_dart().into_dart(), + self.id.into_into_dart().into_dart(), + self.name.into_into_dart().into_dart(), + self.images.into_into_dart().into_dart(), + self.external_uri.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::api::plugin::models::user::SpotubeUserObject +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::api::plugin::models::user::SpotubeUserObject +{ + fn into_into_dart(self) -> crate::api::plugin::models::user::SpotubeUserObject { + self + } +} + +impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(format!("{:?}", self), serializer); + } +} + +impl SseEncode for OpaqueSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for PluginCommand { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >>::sse_encode(flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), serializer); + } +} + +impl SseEncode for Sender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi> +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + impl SseEncode for String { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -194,6 +4877,64 @@ impl SseEncode for String { } } +impl SseEncode for bool { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u8(self as _).unwrap(); + } +} + +impl SseEncode for f64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_f64::(self).unwrap(); + } +} + +impl SseEncode for i32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_i32::(self).unwrap(); + } +} + +impl SseEncode for i64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_i64::(self).unwrap(); + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -204,6 +4945,793 @@ impl SseEncode for Vec { } } +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode + for Vec +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode( + item, serializer, + ); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Vec { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + ::sse_encode(item, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode( + value, serializer, + ); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode( + value, serializer, + ); + } + } +} + +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode(value, serializer); + } + } +} + +impl SseEncode for Option> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + >::sse_encode( + value, serializer, + ); + } + } +} + +impl SseEncode for crate::api::plugin::models::core::PluginAbility { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::plugin::models::core::PluginAbility::Authentication => 0, + crate::api::plugin::models::core::PluginAbility::Scrobbling => 1, + crate::api::plugin::models::core::PluginAbility::Metadata => 2, + crate::api::plugin::models::core::PluginAbility::AudioSource => 3, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::senders::PluginAlbumSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::models::core::PluginApi { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::plugin::models::core::PluginApi::Webview => 0, + crate::api::plugin::models::core::PluginApi::Localstorage => 1, + crate::api::plugin::models::core::PluginApi::Timezone => 2, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::senders::PluginArtistSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::senders::PluginAudioSourceSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::senders::PluginAuthSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::senders::PluginBrowseSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::models::core::PluginConfiguration { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.name, serializer); + ::sse_encode(self.description, serializer); + ::sse_encode(self.version, serializer); + ::sse_encode(self.author, serializer); + ::sse_encode(self.entry_point, serializer); + ::sse_encode(self.plugin_api_version, serializer); + >::sse_encode(self.apis, serializer); + >::sse_encode( + self.abilities, + serializer, + ); + >::sse_encode(self.repository, serializer); + } +} + +impl SseEncode for crate::api::plugin::senders::PluginCoreSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::senders::PluginPlaylistSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::senders::PluginSearchSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::senders::PluginTrackSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::models::core::PluginUpdateAvailable { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.download_url, serializer); + ::sse_encode(self.version, serializer); + >::sse_encode(self.changelog, serializer); + } +} + +impl SseEncode for crate::api::plugin::senders::PluginUserSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} +} + +impl SseEncode for crate::api::plugin::models::core::ScrobbleAlbum { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::core::ScrobbleArtist { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::core::ScrobbleDetails { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.id, serializer); + ::sse_encode(self.title, serializer); + >::sse_encode( + self.artists, + serializer, + ); + ::sse_encode(self.album, serializer); + >::sse_encode(self.timestamp, serializer); + >::sse_encode(self.duration_ms, serializer); + >::sse_encode(self.isrc, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::album::SpotubeAlbumType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::plugin::models::album::SpotubeAlbumType::Album => 0, + crate::api::plugin::models::album::SpotubeAlbumType::Single => 1, + crate::api::plugin::models::album::SpotubeAlbumType::Compilation => 2, + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::models::audio_source::SpotubeAudioLosslessContainerQuality { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.bit_depth, serializer); + ::sse_encode(self.sample_rate, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::audio_source::SpotubeAudioLossyContainerQuality { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.bitrate, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self {crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::Lossy{compression_type,name,qualities} => { ::sse_encode(0, serializer); ::sse_encode(compression_type, serializer); +::sse_encode(name, serializer); +>::sse_encode(qualities, serializer); + } +crate::api::plugin::models::audio_source::SpotubeAudioSourceContainerPreset::Lossless{compression_type,name,qualities} => { ::sse_encode(1, serializer); ::sse_encode(compression_type, serializer); +::sse_encode(name, serializer); +>::sse_encode(qualities, serializer); + } + _ => { unimplemented!(""); }} + } +} + +impl SseEncode for crate::api::plugin::models::audio_source::SpotubeAudioSourceMatchObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.title, serializer); + >::sse_encode(self.artists, serializer); + ::sse_encode(self.duration, serializer); + >::sse_encode(self.thumbnail, serializer); + ::sse_encode(self.external_uri, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::audio_source::SpotubeAudioSourceStreamObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.url, serializer); + ::sse_encode(self.container, serializer); + ::sse_encode( + self.compression_type, + serializer, + ); + >::sse_encode(self.codec, serializer); + >::sse_encode(self.bitrate, serializer); + >::sse_encode(self.bit_depth, serializer); + >::sse_encode(self.sample_rate, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::browse::SpotubeBrowseSectionObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.title, serializer); + ::sse_encode(self.external_uri, serializer); + ::sse_encode(self.browse_more, serializer); + >::sse_encode(self.items, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self {crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::Track(field0) => { ::sse_encode(0, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistFull(field0) => { ::sse_encode(1, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::PlaylistSimple(field0) => { ::sse_encode(2, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::AlbumSimple(field0) => { ::sse_encode(3, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::AlbumFull(field0) => { ::sse_encode(4, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::ArtistFull(field0) => { ::sse_encode(5, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::browse::SpotubeBrowseSectionResponseObjectItem::ArtistSimple(field0) => { ::sse_encode(6, serializer); ::sse_encode(field0, serializer); + } + _ => { unimplemented!(""); }} + } +} + +impl SseEncode for crate::api::plugin::models::album::SpotubeFullAlbumObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + >::sse_encode( + self.artists, + serializer, + ); + >::sse_encode( + self.images, + serializer, + ); + ::sse_encode(self.release_date, serializer); + ::sse_encode(self.external_uri, serializer); + ::sse_encode(self.total_tracks, serializer); + ::sse_encode( + self.album_type, + serializer, + ); + >::sse_encode(self.record_label, serializer); + >>::sse_encode(self.genres, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::artist::SpotubeFullArtistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.external_uri, serializer); + >::sse_encode( + self.images, + serializer, + ); + >>::sse_encode(self.genres, serializer); + >::sse_encode(self.followers, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::playlist::SpotubeFullPlaylistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.description, serializer); + ::sse_encode(self.external_uri, serializer); + ::sse_encode(self.owner, serializer); + >::sse_encode( + self.images, + serializer, + ); + >::sse_encode( + self.collaborators, + serializer, + ); + ::sse_encode(self.collaborative, serializer); + ::sse_encode(self.public, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::image::SpotubeImageObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.url, serializer); + >::sse_encode(self.width, serializer); + >::sse_encode(self.height, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::audio_source::SpotubeMediaCompressionType { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode( + match self { + crate::api::plugin::models::audio_source::SpotubeMediaCompressionType::Lossy => 0, + crate::api::plugin::models::audio_source::SpotubeMediaCompressionType::Lossless => { + 1 + } + _ => { + unimplemented!(""); + } + }, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::models::pagination::SpotubePaginationResponseObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.limit, serializer); + >::sse_encode(self.next_offset, serializer); + ::sse_encode(self.total, serializer); + ::sse_encode(self.has_more, serializer); + >::sse_encode(self.items, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self {crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::Track(field0) => { ::sse_encode(0, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistFull(field0) => { ::sse_encode(1, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::PlaylistSimple(field0) => { ::sse_encode(2, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::AlbumSimple(field0) => { ::sse_encode(3, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::AlbumFull(field0) => { ::sse_encode(4, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::ArtistFull(field0) => { ::sse_encode(5, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::ArtistSimple(field0) => { ::sse_encode(6, serializer); ::sse_encode(field0, serializer); + } +crate::api::plugin::models::pagination::SpotubePaginationResponseObjectItem::BrowseSection(field0) => { ::sse_encode(7, serializer); ::sse_encode(field0, serializer); + } + _ => { unimplemented!(""); }} + } +} + +impl SseEncode for crate::api::plugin::plugin::SpotubePlugin { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.artist, serializer); + ::sse_encode(self.album, serializer); + ::sse_encode( + self.audio_source, + serializer, + ); + ::sse_encode(self.auth, serializer); + ::sse_encode(self.browse, serializer); + ::sse_encode(self.core, serializer); + ::sse_encode(self.playlist, serializer); + ::sse_encode(self.search, serializer); + ::sse_encode(self.track, serializer); + ::sse_encode(self.user, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::search::SpotubeSearchResponseObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + >::sse_encode( + self.albums, + serializer, + ); + >::sse_encode( + self.artists, + serializer, + ); + >::sse_encode( + self.playlists, + serializer, + ); + >::sse_encode( + self.tracks, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::models::album::SpotubeSimpleAlbumObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.external_uri, serializer); + >::sse_encode( + self.artists, + serializer, + ); + >::sse_encode( + self.images, + serializer, + ); + ::sse_encode( + self.album_type, + serializer, + ); + >::sse_encode(self.release_date, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::artist::SpotubeSimpleArtistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.external_uri, serializer); + >>::sse_encode( + self.images, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::models::playlist::SpotubeSimplePlaylistObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.description, serializer); + ::sse_encode(self.external_uri, serializer); + ::sse_encode(self.owner, serializer); + >::sse_encode( + self.images, + serializer, + ); + } +} + +impl SseEncode for crate::api::plugin::models::track::SpotubeTrackObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + ::sse_encode(self.external_uri, serializer); + >::sse_encode( + self.artists, + serializer, + ); + ::sse_encode( + self.album, serializer, + ); + ::sse_encode(self.duration_ms, serializer); + ::sse_encode(self.isrc, serializer); + ::sse_encode(self.explicit, serializer); + } +} + +impl SseEncode for crate::api::plugin::models::user::SpotubeUserObject { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.type_name, serializer); + ::sse_encode(self.id, serializer); + ::sse_encode(self.name, serializer); + >::sse_encode( + self.images, + serializer, + ); + ::sse_encode(self.external_uri, serializer); + } +} + +impl SseEncode for u32 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u32::(self).unwrap(); + } +} + +impl SseEncode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u64::(self).unwrap(); + } +} + impl SseEncode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -216,17 +5744,13 @@ impl SseEncode for () { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {} } -impl SseEncode for i32 { +impl SseEncode for usize { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_i32::(self).unwrap(); - } -} - -impl SseEncode for bool { - // Codec=Sse (Serialization based), see doc to use other codecs - fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { - serializer.cursor.write_u8(self as _).unwrap(); + serializer + .cursor + .write_u64::(self as _) + .unwrap(); } } @@ -238,6 +5762,8 @@ mod io { // Section: imports use super::*; + use crate::api::plugin::commands::*; + use crate::api::plugin::plugin::*; use flutter_rust_bridge::for_generated::byteorder::{ NativeEndian, ReadBytesExt, WriteBytesExt, }; @@ -246,31 +5772,51 @@ mod io { // Section: boilerplate + use tokio::sync::mpsc::Sender; + flutter_rust_bridge::frb_generated_boilerplate_io!(); + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerPluginCommand( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>::decrement_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSenderPluginCommand( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } } #[cfg(not(target_family = "wasm"))] pub use io::*; - -/// cbindgen:ignore -#[cfg(target_family = "wasm")] -mod web { - // This file is automatically generated, so please do not edit it. - // @generated by `flutter_rust_bridge`@ 2.11.1. - - // Section: imports - - use super::*; - use flutter_rust_bridge::for_generated::byteorder::{ - NativeEndian, ReadBytesExt, WriteBytesExt, - }; - use flutter_rust_bridge::for_generated::wasm_bindgen; - use flutter_rust_bridge::for_generated::wasm_bindgen::prelude::*; - use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable}; - use flutter_rust_bridge::{Handler, IntoIntoDart}; - - // Section: boilerplate - - flutter_rust_bridge::frb_generated_boilerplate_web!(); -} -#[cfg(target_family = "wasm")] -pub use web::*; diff --git a/rust/src/internal/album.rs b/rust/src/internal/album.rs new file mode 100644 index 00000000..3c19c978 --- /dev/null +++ b/rust/src/internal/album.rs @@ -0,0 +1,148 @@ +use crate::api::plugin::models::album::SpotubeFullAlbumObject; +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginAlbumEndpoint<'a>(&'a mut Context); + +impl<'a> PluginAlbumEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginAlbumEndpoint<'a> { + PluginAlbumEndpoint(context) + } + + fn album_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("album"), self.0) + .or_else(|e| Err(anyhow!("album not found: \n{}", e))) + } + + pub async fn get_album(&mut self, id: String) -> anyhow::Result { + let album_val = self.album_obj()?; + let album_object = album_val.as_object().ok_or(anyhow!("Not an object"))?; + + let get_album_fn = album_object + .get(js_string!("getAlbum"), self.0) + .map_err(|e| anyhow!("JS error while accessing getAlbum: {}", e))? + .as_function() + .ok_or(anyhow!("getAlbum is not a function"))?; + + let args = [JsValue::from(js_string!(id))]; + + let res_json = + utils::js_call_to_json(get_album_fn.call(&album_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn tracks( + &mut self, + + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let album_val = self.album_obj()?; + let album_object = album_val.as_object().ok_or(anyhow!("Not an object"))?; + + let tracks_fn = album_object + .get(js_string!("tracks"), self.0) + .map_err(|e| anyhow!("JS error while accessing tracks: {}", e))? + .as_function() + .ok_or(anyhow!("tracks is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(id)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(tracks_fn.call(&album_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn releases( + &mut self, + + offset: Option, + limit: Option, + ) -> anyhow::Result { + let album_val = self.album_obj()?; + let album_object = album_val.as_object().ok_or(anyhow!("Not an object"))?; + + let releases_fn = album_object + .get(js_string!("releases"), self.0) + .map_err(|e| anyhow!("JS error while accessing releases: {}", e))? + .as_function() + .ok_or(anyhow!("releases is not a function"))?; + + let args: [JsValue; 2] = [ + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = + utils::js_call_to_json(releases_fn.call(&album_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn save(&mut self, ids: Vec) -> anyhow::Result<()> { + let album_val = self.album_obj()?; + let album_object = album_val.as_object().ok_or(anyhow!("Not an object"))?; + + let save_fn = album_object + .get(js_string!("save"), self.0) + .map_err(|e| anyhow!("JS error while accessing save: {}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let ids_val = utils::vec_string_to_js_array(ids, self.0)?; + let args = [ids_val.into()]; + + utils::js_call_to_void(save_fn.call(&album_val, &args, self.0), self.0)?; + + Ok(()) + } + + pub async fn unsave(&mut self, ids: Vec) -> anyhow::Result<()> { + let album_val = self.album_obj()?; + let album_object = album_val.as_object().ok_or(anyhow!("Not an object"))?; + + let unsave_fn = album_object + .get(js_string!("unsave"), self.0) + .map_err(|e| anyhow!("JS error while accessing save: {}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let ids_val = utils::vec_string_to_js_array(ids, self.0)?; + let args = [ids_val.into()]; + + utils::js_call_to_void(unsave_fn.call(&album_val, &args, self.0), self.0)?; + + Ok(()) + } +} diff --git a/rust/src/internal/apis/fetcher.rs b/rust/src/internal/apis/fetcher.rs new file mode 100644 index 00000000..50713ed4 --- /dev/null +++ b/rust/src/internal/apis/fetcher.rs @@ -0,0 +1,59 @@ +use std::{cell::RefCell, rc::Rc}; + +use boa_engine::{Context, Finalize, JsData, JsResult, Trace}; +use boa_runtime::fetch::{request::JsRequest, response::JsResponse, Fetcher}; + +#[derive(Default, Debug, Clone, Trace, Finalize, JsData)] +pub struct ReqwestFetcher { + #[unsafe_ignore_trace] + client: reqwest::Client, +} + +impl ReqwestFetcher { + pub fn new() -> Self { + ReqwestFetcher { + client: reqwest::Client::new(), + } + } +} + +impl Fetcher for ReqwestFetcher { + async fn fetch( + self: Rc, + request: JsRequest, + _context: &RefCell<&mut Context>, + ) -> JsResult { + use boa_engine::{JsError, JsString}; + + let request = request.into_inner(); + let method = request.method().clone(); + let url = request.uri().to_string(); + let req = self + .client + .request(method, &url) + .headers(request.headers().clone()); + + let req = req + .body(request.body().clone()) + .build() + .map_err(JsError::from_rust)?; + + let resp = self.client.execute(req).await.map_err(JsError::from_rust)?; + + let status = resp.status(); + let headers = resp.headers().clone(); + let bytes = resp.bytes().await.map_err(JsError::from_rust)?; + let mut builder = http::Response::builder().status(status.as_u16()); + + for k in headers.keys() { + for v in headers.get_all(k) { + builder = builder.header(k.as_str(), v); + } + } + + builder + .body(bytes.to_vec()) + .map_err(JsError::from_rust) + .map(|request| JsResponse::basic(JsString::from(url), request)) + } +} diff --git a/rust/src/internal/apis/mod.rs b/rust/src/internal/apis/mod.rs new file mode 100644 index 00000000..44bd8a70 --- /dev/null +++ b/rust/src/internal/apis/mod.rs @@ -0,0 +1 @@ +pub mod fetcher; diff --git a/rust/src/internal/artist.rs b/rust/src/internal/artist.rs new file mode 100644 index 00000000..4584a32d --- /dev/null +++ b/rust/src/internal/artist.rs @@ -0,0 +1,180 @@ +use crate::api::plugin::models::artist::SpotubeFullArtistObject; +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginArtistEndpoint<'a>(&'a mut Context); + +impl<'a> PluginArtistEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginArtistEndpoint<'a> { + PluginArtistEndpoint(context) + } + + fn artist_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + return plugin_instance + .get(js_string!("artist"), self.0) + .or_else(|e| Err(anyhow!("artist not found: \n{}", e))); + } + + pub async fn get_artist(&mut self, id: String) -> anyhow::Result { + let artist_val = self.artist_obj()?; + let artist_object = artist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let get_artist_fn = artist_object + .get(js_string!("getArtist"), self.0) + .map_err(|e| anyhow!("JS error while accessing getArtist: {}", e))? + .as_function() + .ok_or(anyhow!("getArtist is not a function"))?; + + let args = [JsValue::from(js_string!(id))]; + + let res_json = + utils::js_call_to_json(get_artist_fn.call(&artist_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn top_tracks( + &mut self, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let artist_val = self.artist_obj()?; + let artist_object = artist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let top_tracks_fn = artist_object + .get(js_string!("topTracks"), self.0) + .map_err(|e| anyhow!("JS error while accessing getArtist: {}", e))? + .as_function() + .ok_or(anyhow!("getArtist is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(id)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = + utils::js_call_to_json(top_tracks_fn.call(&artist_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn albums( + &mut self, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let artist_val = self.artist_obj()?; + let artist_object = artist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let albums_fn = artist_object + .get(js_string!("albums"), self.0) + .map_err(|e| anyhow!("JS error while accessing albums: {}", e))? + .as_function() + .ok_or(anyhow!("albums is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(id)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(albums_fn.call(&artist_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn related( + &mut self, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let artist_val = self.artist_obj()?; + let artist_object = artist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let related_fn = artist_object + .get(js_string!("related"), self.0) + .map_err(|e| anyhow!("JS error while accessing related: {}", e))? + .as_function() + .ok_or(anyhow!("related is not a function"))?; + + let args = [ + JsValue::from(js_string!(id)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(related_fn.call(&artist_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn save(&mut self, ids: Vec) -> anyhow::Result<()> { + let artist_val = self.artist_obj()?; + let artist_object = artist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let save_fn = artist_object + .get(js_string!("save"), self.0) + .map_err(|e| anyhow!("JS error while accessing save: {}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let ids_val = utils::vec_string_to_js_array(ids, self.0)?; + let args = [ids_val.into()]; + + utils::js_call_to_void(save_fn.call(&artist_val, &args, self.0), self.0)?; + + Ok(()) + } + + pub async fn unsave(&mut self, ids: Vec) -> anyhow::Result<()> { + let artist_val = self.artist_obj()?; + let artist_object = artist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let unsave_fn = artist_object + .get(js_string!("unsave"), self.0) + .map_err(|e| anyhow!("JS error while accessing save: {}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let ids_val = utils::vec_string_to_js_array(ids, self.0)?; + let args = [ids_val.into()]; + + utils::js_call_to_void(unsave_fn.call(&artist_val, &args, self.0), self.0)?; + + Ok(()) + } +} diff --git a/rust/src/internal/audio_source.rs b/rust/src/internal/audio_source.rs new file mode 100644 index 00000000..c2b2a9f5 --- /dev/null +++ b/rust/src/internal/audio_source.rs @@ -0,0 +1,81 @@ +use crate::api::plugin::models::audio_source::{ + SpotubeAudioSourceMatchObject, SpotubeAudioSourceStreamObject, +}; +use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginAudioSourceEndpoint<'a>(&'a mut Context); + +impl<'a> PluginAudioSourceEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginAudioSourceEndpoint<'a> { + PluginAudioSourceEndpoint(context) + } + + fn audio_source_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("audioSource"), self.0) + .or_else(|e| Err(anyhow!("artist not found: \n{}", e))) + } + + pub async fn matches( + &mut self, + track: SpotubeTrackObject, + ) -> anyhow::Result> { + let audio_source_val = self.audio_source_obj()?; + let audio_source_object = audio_source_val + .as_object() + .ok_or(anyhow!("Not an object"))?; + + let matches_fn = audio_source_object + .get(js_string!("matches"), self.0) + .map_err(|e| anyhow!("JS error while accessing matches: {}", e))? + .as_function() + .ok_or(anyhow!("matches is not a function"))?; + + let value = serde_json::to_value(track)?; + let track_val = utils::json_value_to_js(&value, self.0).map_err(|e| anyhow!("{}", e))?; + let args = [track_val]; + + let res = + utils::js_call_to_json(matches_fn.call(&audio_source_val, &args, self.0), self.0)?; + + serde_json::from_value(res).map_err(|e| anyhow!("{}", e)) + } + + pub async fn streams( + &mut self, + matched: SpotubeAudioSourceMatchObject, + ) -> anyhow::Result> { + let audio_source_val = self.audio_source_obj()?; + let audio_source_object = audio_source_val + .as_object() + .ok_or(anyhow!("Not an object"))?; + + let matches_fn = audio_source_object + .get(js_string!("streams"), self.0) + .map_err(|e| anyhow!("JS error while accessing matches: {}", e))? + .as_function() + .ok_or(anyhow!("matches is not a function"))?; + + let value = serde_json::to_value(matched)?; + let matched_val = utils::json_value_to_js(&value, self.0).map_err(|e| anyhow!("{}", e))?; + let args = [matched_val]; + + let res = + utils::js_call_to_json(matches_fn.call(&audio_source_val, &args, self.0), self.0)?; + + serde_json::from_value(res).map_err(|e| anyhow!("{}", e)) + } +} diff --git a/rust/src/internal/auth.rs b/rust/src/internal/auth.rs new file mode 100644 index 00000000..4d02fad3 --- /dev/null +++ b/rust/src/internal/auth.rs @@ -0,0 +1,74 @@ +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginAuthEndpoint<'a>(&'a mut Context); + +impl<'a> PluginAuthEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginAuthEndpoint<'a> { + PluginAuthEndpoint(context) + } + + fn auth_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + return plugin_instance + .get(js_string!("auth"), self.0) + .or_else(|e| Err(anyhow!("auth not found:\n{}", e))); + } + + pub async fn authenticate(&mut self) -> anyhow::Result<()> { + let auth_val = self.auth_obj()?; + let auth_object = auth_val.as_object().ok_or(anyhow!("Not an object"))?; + + let authenticate_fn = auth_object + .get(js_string!("authenticate"), self.0) + .map_err(|e| anyhow!("JS error while accessing authenticate: {}", e))? + .as_function() + .ok_or(anyhow!("authenticate is not a function"))?; + + let args = []; + + utils::js_call_to_void(authenticate_fn.call(&auth_val, &args, self.0), self.0) + } + + pub fn is_authenticated(&mut self) -> anyhow::Result { + let auth_val = self.auth_obj()?; + let auth_object = auth_val.as_object().ok_or(anyhow!("Not an object"))?; + + let authenticate_fn = auth_object + .get(js_string!("is_authenticated"), self.0) + .map_err(|e| anyhow!("JS error while accessing authenticate: {}", e))? + .as_function() + .ok_or(anyhow!("authenticate is not a function"))?; + + authenticate_fn + .call(&auth_val, &[], self.0) + .map_err(|e| anyhow!("{}", e))? + .as_boolean() + .ok_or(anyhow!("Not a boolean")) + } + + pub async fn logout(&mut self) -> anyhow::Result<()> { + let auth_val = self.auth_obj()?; + let auth_object = auth_val.as_object().ok_or(anyhow!("Not an object"))?; + + let logout_fn = auth_object + .get(js_string!("logout"), self.0) + .map_err(|e| anyhow!("JS error while accessing authenticate: {}", e))? + .as_function() + .ok_or(anyhow!("authenticate is not a function"))?; + + let args = []; + + utils::js_call_to_void(logout_fn.call(&auth_val, &args, self.0), self.0) + } +} diff --git a/rust/src/internal/browse.rs b/rust/src/internal/browse.rs new file mode 100644 index 00000000..d79ef694 --- /dev/null +++ b/rust/src/internal/browse.rs @@ -0,0 +1,91 @@ +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; + +#[derive(Debug)] +pub struct PluginBrowseEndpoint<'a>(&'a mut Context); + +impl<'a> PluginBrowseEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginBrowseEndpoint<'a> { + PluginBrowseEndpoint(context) + } + + fn browse_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("browse"), self.0) + .or_else(|e| Err(anyhow!("browse not found:\n{}", e))) + } + + pub async fn sections( + &mut self, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let browse_val = self.browse_obj()?; + let browse_object = browse_val.as_object().ok_or(anyhow!("Not an object"))?; + + let sections_fn = browse_object + .get(js_string!("sections"), self.0) + .map_err(|e| anyhow!("JS error while accessing sections: {}", e))? + .as_function() + .ok_or(anyhow!("sections is not a function"))?; + + let args = [ + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res = utils::js_call_to_json(sections_fn.call(&browse_val, &args, self.0), self.0)?; + + serde_json::from_value(res).map_err(|e| anyhow!("{}", e)) + } + + pub async fn section_items( + &mut self, + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let browse_val = self.browse_obj()?; + let browse_object = browse_val.as_object().ok_or(anyhow!("Not an object"))?; + + let section_items_fn = browse_object + .get(js_string!("sectionItems"), self.0) + .map_err(|e| anyhow!("JS error while accessing sectionItems: {}", e))? + .as_function() + .ok_or(anyhow!("sectionItems is not a function"))?; + + let args = [ + JsValue::from(js_string!(id)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res = + utils::js_call_to_json(section_items_fn.call(&browse_val, &args, self.0), self.0)?; + + serde_json::from_value(res).map_err(|e| anyhow!("{}", e)) + } +} diff --git a/rust/src/internal/core.rs b/rust/src/internal/core.rs new file mode 100644 index 00000000..d48ae898 --- /dev/null +++ b/rust/src/internal/core.rs @@ -0,0 +1,86 @@ +use crate::api::plugin::models::core::{PluginConfiguration, PluginUpdateAvailable, ScrobbleDetails}; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginCoreEndpoint<'a>(&'a mut Context); + +impl<'a> PluginCoreEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginCoreEndpoint<'a> { + PluginCoreEndpoint(context) + } + + fn core_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("core"), self.0) + .or_else(|e| Err(anyhow!("core not found:\n{}", e))) + } + + pub async fn check_update( + &mut self, + plugin_config: PluginConfiguration, + ) -> anyhow::Result> { + let core_val = self.core_obj()?; + let core_object = core_val.as_object().ok_or(anyhow!("Not an object"))?; + + let check_update_fn = core_object + .get(js_string!("checkUpdate"), self.0) + .map_err(|e| anyhow!("JS error while accessing checkUpdate: {}", e))? + .as_function() + .ok_or(anyhow!("checkUpdate is not a function"))?; + + let value = serde_json::to_value(plugin_config)?; + let config_val = utils::json_value_to_js(&value, self.0).map_err(|e| anyhow!("{}", e))?; + let args = [config_val]; + + let res = utils::js_call_to_json(check_update_fn.call(&core_val, &args, self.0), self.0)?; + + if res.is_null() { + Ok(None) + } else { + serde_json::from_value(res).map_err(|e| anyhow!("{}", e)) + } + } + + pub fn support(&mut self) -> anyhow::Result { + let core_val = self.core_obj()?; + let core_object = core_val.as_object().ok_or(anyhow!("Not an object"))?; + + let support_val = core_object + .get(js_string!("support"), self.0) + .map_err(|e| anyhow!("JS error while accessing support: {}", e))?; + + support_val + .as_string() + .ok_or(anyhow!("support is not a string"))? + .to_std_string() + .map_err(|e| anyhow!("{}", e)) + } + + pub async fn scrobble(&mut self, details: ScrobbleDetails) -> anyhow::Result<()> { + let core_val = self.core_obj()?; + let core_object = core_val.as_object().ok_or(anyhow!("Not an object"))?; + + let scrobble_fn = core_object + .get(js_string!("scrobble"), self.0) + .map_err(|e| anyhow!("JS error while accessing scrobble: {}", e))? + .as_function() + .ok_or(anyhow!("scrobble is not a function"))?; + + let value = serde_json::to_value(details)?; + let details_val = utils::json_value_to_js(&value, self.0).map_err(|e| anyhow!("{}", e))?; + let args = [details_val]; + + utils::js_call_to_void(scrobble_fn.call(&core_val, &args, self.0), self.0) + } +} diff --git a/rust/src/internal/mod.rs b/rust/src/internal/mod.rs new file mode 100644 index 00000000..965413d8 --- /dev/null +++ b/rust/src/internal/mod.rs @@ -0,0 +1,13 @@ +pub mod album; +pub mod apis; +pub mod artist; +pub mod audio_source; +pub mod browse; +pub mod core; +pub mod playlist; +pub mod search; +pub mod track; +pub mod user; +pub mod auth; +mod utils; +// Export Context diff --git a/rust/src/internal/playlist.rs b/rust/src/internal/playlist.rs new file mode 100644 index 00000000..e70c3653 --- /dev/null +++ b/rust/src/internal/playlist.rs @@ -0,0 +1,268 @@ +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::api::plugin::models::playlist::SpotubeFullPlaylistObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginPlaylistEndpoint<'a>(&'a mut Context); + +impl<'a> PluginPlaylistEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginPlaylistEndpoint<'a> { + PluginPlaylistEndpoint(context) + } + + fn playlist_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("playlist"), self.0) + .or_else(|e| Err(anyhow!("playlist not found: \n{}", e))) + } + + pub async fn get_playlist(&mut self, id: String) -> anyhow::Result { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let get_playlist_fn = playlist_object + .get(js_string!("getPlaylist"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("getPlaylist is not a function"))?; + + let args = [JsValue::from(js_string!(id))]; + + let res_json = + utils::js_call_to_json(get_playlist_fn.call(&playlist_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn tracks( + &mut self, + + id: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let tracks_fn = playlist_object + .get(js_string!("tracks"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("tracks is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(id)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = + utils::js_call_to_json(tracks_fn.call(&playlist_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn create( + &mut self, + + user_id: String, + name: String, + description: Option, + public: Option, + collaborative: Option, + ) -> anyhow::Result> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let create_fn = playlist_object + .get(js_string!("create"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("create is not a function"))?; + + let args = [ + JsValue::from(js_string!(user_id)), + JsValue::from(js_string!(name)), + match description { + Some(o) => JsValue::from(js_string!(o)), + None => JsValue::undefined(), + }, + match public { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match collaborative { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = + utils::js_call_to_json(create_fn.call(&playlist_val, &args, self.0), self.0)?; + + if res_json.is_null() { + Ok(None) + } else { + serde_json::from_value(res_json) + .map(Some) + .map_err(|e| anyhow!("{}", e)) + } + } + + pub async fn update( + &mut self, + + playlist_id: String, + name: Option, + description: Option, + public: Option, + collaborative: Option, + ) -> anyhow::Result<()> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let update_fn = playlist_object + .get(js_string!("update"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("update is not a function"))?; + + let args = [ + JsValue::from(js_string!(playlist_id)), + match name { + Some(o) => JsValue::from(js_string!(o)), + None => JsValue::undefined(), + }, + match description { + Some(o) => JsValue::from(js_string!(o)), + None => JsValue::undefined(), + }, + match public { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match collaborative { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + utils::js_call_to_void(update_fn.call(&playlist_val, &args, self.0), self.0) + } + + pub async fn add_tracks( + &mut self, + + playlist_id: String, + track_ids: Vec, + position: Option, + ) -> anyhow::Result<()> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let add_tracks_fn = playlist_object + .get(js_string!("addTracks"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("addTracks is not a function"))?; + + let args = [ + JsValue::from(js_string!(playlist_id)), + utils::vec_string_to_js_array(track_ids, self.0)?, + match position { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + utils::js_call_to_void(add_tracks_fn.call(&playlist_val, &args, self.0), self.0) + } + + pub async fn remove_tracks( + &mut self, + + playlist_id: String, + track_ids: Vec, + ) -> anyhow::Result<()> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let remove_tracks_fn = playlist_object + .get(js_string!("removeTracks"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("removeTracks is not a function"))?; + + let args = [ + JsValue::from(js_string!(playlist_id)), + utils::vec_string_to_js_array(track_ids, self.0)?, + ]; + + utils::js_call_to_void(remove_tracks_fn.call(&playlist_val, &args, self.0), self.0) + } + + pub async fn save(&mut self, playlist_id: String) -> anyhow::Result<()> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let save_fn = playlist_object + .get(js_string!("save"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let args = [JsValue::from(js_string!(playlist_id))]; + + utils::js_call_to_void(save_fn.call(&playlist_val, &args, self.0), self.0) + } + + pub async fn unsave(&mut self, playlist_id: String) -> anyhow::Result<()> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let unsave_fn = playlist_object + .get(js_string!("unsave"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("unsave is not a function"))?; + + let args = [JsValue::from(js_string!(playlist_id))]; + + utils::js_call_to_void(unsave_fn.call(&playlist_val, &args, self.0), self.0) + } + + pub async fn delete_playlist(&mut self, playlist_id: String) -> anyhow::Result<()> { + let playlist_val = self.playlist_obj()?; + let playlist_object = playlist_val.as_object().ok_or(anyhow!("Not an object"))?; + + let delete_playlist_fn = playlist_object + .get(js_string!("deletePlaylist"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("deletePlaylist is not a function"))?; + + let args = [JsValue::from(js_string!(playlist_id))]; + + utils::js_call_to_void( + delete_playlist_fn.call(&playlist_val, &args, self.0), + self.0, + ) + } +} diff --git a/rust/src/internal/search.rs b/rust/src/internal/search.rs new file mode 100644 index 00000000..3e7f5004 --- /dev/null +++ b/rust/src/internal/search.rs @@ -0,0 +1,201 @@ +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::api::plugin::models::search::SpotubeSearchResponseObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::object::builtins::JsArray; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginSearchEndpoint<'a>(&'a mut Context); + +impl<'a> PluginSearchEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginSearchEndpoint<'a> { + PluginSearchEndpoint(context) + } + + fn search_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("search"), self.0) + .or_else(|e| Err(anyhow!("search not found: \n{}", e))) + } + + pub fn chips(&mut self) -> anyhow::Result> { + let search_val = self.search_obj()?; + let search_object = search_val.as_object().ok_or(anyhow!("Not an object"))?; + + let chips_val = search_object + .get(js_string!("chips"), self.0) + .map_err(|e| anyhow!("{}", e))?; + let chips_obj = chips_val.as_object().ok_or(anyhow!("Not an object"))?; + + if !chips_obj.is_array() { + return Err(anyhow!("chips is not an array")); + } + + let chips_array = JsArray::from_object(chips_obj.clone()).map_err(|e| anyhow!("{}", e))?; + let length = chips_array.length(self.0).map_err(|e| anyhow!("{}", e))?; + let mut result = Vec::new(); + for i in 0..length { + let item = chips_array.get(i, self.0).map_err(|e| anyhow!("{}", e))?; + if let Some(s) = item.as_string() { + result.push(s.to_std_string().map_err(|e| anyhow!("{}", e))?); + } + } + Ok(result) + } + + pub async fn all(&mut self, query: String) -> anyhow::Result { + let search_val = self.search_obj()?; + let search_object = search_val.as_object().ok_or(anyhow!("Not an object"))?; + + let all_fn = search_object + .get(js_string!("all"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("all is not a function"))?; + + let args = [JsValue::from(js_string!(query))]; + + let res_json = utils::js_call_to_json(all_fn.call(&search_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn albums( + &mut self, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let search_val = self.search_obj()?; + let search_object = search_val.as_object().ok_or(anyhow!("Not an object"))?; + + let albums_fn = search_object + .get(js_string!("albums"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("albums is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(query)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(albums_fn.call(&search_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn artists( + &mut self, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let search_val = self.search_obj()?; + let search_object = search_val.as_object().ok_or(anyhow!("Not an object"))?; + + let artists_fn = search_object + .get(js_string!("artists"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("artists is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(query)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(artists_fn.call(&search_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn playlists( + &mut self, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let search_val = self.search_obj()?; + let search_object = search_val.as_object().ok_or(anyhow!("Not an object"))?; + + let playlists_fn = search_object + .get(js_string!("playlists"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("playlists is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(query)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = + utils::js_call_to_json(playlists_fn.call(&search_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn tracks( + &mut self, + query: String, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let search_val = self.search_obj()?; + let search_object = search_val.as_object().ok_or(anyhow!("Not an object"))?; + + let tracks_fn = search_object + .get(js_string!("tracks"), self.0) + .map_err(|e| anyhow!("{}", e))? + .as_function() + .ok_or(anyhow!("tracks is not a function"))?; + + let args: [JsValue; 3] = [ + JsValue::from(js_string!(query)), + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(tracks_fn.call(&search_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } +} diff --git a/rust/src/internal/track.rs b/rust/src/internal/track.rs new file mode 100644 index 00000000..21c576f3 --- /dev/null +++ b/rust/src/internal/track.rs @@ -0,0 +1,100 @@ +use crate::api::plugin::models::track::SpotubeTrackObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; + +#[derive(Debug)] +pub struct PluginTrackEndpoint<'a>(&'a mut Context); + +impl<'a> PluginTrackEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginTrackEndpoint<'a> { + PluginTrackEndpoint(context) + } + + fn track_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("track"), self.0) + .or_else(|e| Err(anyhow!("track not found: \n{}", e))) + } + + pub async fn get_track(&mut self, id: String) -> anyhow::Result { + let track_val = self.track_obj()?; + let track_object = track_val.as_object().ok_or(anyhow!("Not an object"))?; + + let get_track_fn = track_object + .get(js_string!("getTrack"), self.0) + .map_err(|e| anyhow!("JS error while accessing getTrack: {}", e))? + .as_function() + .ok_or(anyhow!("getTrack is not a function"))?; + + let args = [JsValue::from(js_string!(id))]; + + let res_json = + utils::js_call_to_json(get_track_fn.call(&track_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn save(&mut self, ids: Vec) -> anyhow::Result<()> { + let track_val = self.track_obj()?; + let track_object = track_val.as_object().ok_or(anyhow!("Not an object"))?; + + let save_fn = track_object + .get(js_string!("save"), self.0) + .map_err(|e| anyhow!("JS error while accessing save: {}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let ids_val = utils::vec_string_to_js_array(ids, self.0)?; + let args = [ids_val.into()]; + + utils::js_call_to_void(save_fn.call(&track_val, &args, self.0), self.0)?; + + Ok(()) + } + + pub async fn unsave(&mut self, ids: Vec) -> anyhow::Result<()> { + let track_val = self.track_obj()?; + let track_object = track_val.as_object().ok_or(anyhow!("Not an object"))?; + + let unsave_fn = track_object + .get(js_string!("unsave"), self.0) + .map_err(|e| anyhow!("JS error while accessing save: {}", e))? + .as_function() + .ok_or(anyhow!("save is not a function"))?; + + let ids_val = utils::vec_string_to_js_array(ids, self.0)?; + let args = [ids_val.into()]; + + utils::js_call_to_void(unsave_fn.call(&track_val, &args, self.0), self.0)?; + + Ok(()) + } + + pub async fn radio(&mut self, id: String) -> anyhow::Result> { + let track_val = self.track_obj()?; + let track_object = track_val.as_object().ok_or(anyhow!("Not an object"))?; + + let get_track_fn = track_object + .get(js_string!("radio"), self.0) + .map_err(|e| anyhow!("JS error while accessing radio: {}", e))? + .as_function() + .ok_or(anyhow!("radio is not a function"))?; + + let args = [JsValue::from(js_string!(id))]; + + let res_json = + utils::js_call_to_json(get_track_fn.call(&track_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } +} diff --git a/rust/src/internal/user.rs b/rust/src/internal/user.rs new file mode 100644 index 00000000..bb1e1e36 --- /dev/null +++ b/rust/src/internal/user.rs @@ -0,0 +1,107 @@ +use crate::api::plugin::models::pagination::SpotubePaginationResponseObject; +use crate::internal::utils; +use anyhow::anyhow; +use boa_engine::{js_string, Context, JsValue}; +use flutter_rust_bridge::frb; +use crate::api::plugin::models::user::SpotubeUserObject; + +#[derive(Debug)] +pub struct PluginUserEndpoint<'a>(&'a mut Context); + +impl<'a> PluginUserEndpoint<'a> { + #[frb(ignore)] + pub fn new(context: &'a mut Context) -> PluginUserEndpoint<'a> { + PluginUserEndpoint(context) + } + + fn user_obj(&mut self) -> anyhow::Result { + let global = self.0.global_object(); + + let plugin_instance = global + .get(js_string!("pluginInstance"), self.0) + .map_err(|e| anyhow!("{}", e)) + .and_then(|a| a.as_object().ok_or(anyhow!("Not an object")))?; + + plugin_instance + .get(js_string!("user"), self.0) + .or_else(|e| Err(anyhow!("user not found: \n{}", e))) + } + + pub async fn me(&mut self) -> anyhow::Result { + let user_val = self.user_obj()?; + let user_object = user_val.as_object().ok_or(anyhow!("Not an object"))?; + + let me_fn = user_object + .get(js_string!("me"), self.0) + .map_err(|e| anyhow!("JS error while accessing me: {}", e))? + .as_function() + .ok_or(anyhow!("me is not a function"))?; + + let res_json = utils::js_call_to_json(me_fn.call(&user_val, &[], self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + async fn get_saved( + &mut self, + method: &str, + offset: Option, + limit: Option, + ) -> anyhow::Result { + let user_val = self.user_obj()?; + let user_object = user_val.as_object().ok_or(anyhow!("Not an object"))?; + + let saved_fn = user_object + .get(js_string!(method), self.0) + .map_err(|e| anyhow!("JS error while accessing {}: {}", method, e))? + .as_function() + .ok_or(anyhow!("{} is not a function", method))?; + + let args: [JsValue; 2] = [ + match offset { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + match limit { + Some(o) => JsValue::from(o), + None => JsValue::undefined(), + }, + ]; + + let res_json = utils::js_call_to_json(saved_fn.call(&user_val, &args, self.0), self.0)?; + + serde_json::from_value(res_json).map_err(|e| anyhow!("{}", e)) + } + + pub async fn saved_playlists( + &mut self, + offset: Option, + limit: Option, + ) -> anyhow::Result { + self.get_saved("savedPlaylists", offset, limit).await + } + + pub async fn saved_tracks( + &mut self, + offset: Option, + limit: Option, + ) -> anyhow::Result { + self.get_saved("savedTracks", offset, limit).await + } + + pub async fn saved_albums( + &mut self, + offset: Option, + limit: Option, + ) -> anyhow::Result { + self.get_saved("savedAlbums", offset, limit).await + } + + pub async fn saved_artists( + &mut self, + offset: Option, + limit: Option, + ) -> anyhow::Result { + self.get_saved("savedArtists", offset, limit).await + } +} diff --git a/rust/src/internal/utils.rs b/rust/src/internal/utils.rs new file mode 100644 index 00000000..d99e47ca --- /dev/null +++ b/rust/src/internal/utils.rs @@ -0,0 +1,166 @@ +use anyhow::anyhow; +use boa_engine::property::PropertyKey; +use boa_engine::{ + object::builtins::JsArray, Context, JsObject, JsResult, JsString, JsValue, +}; +use serde_json::{Map, Value}; + +pub fn vec_string_to_js_array( + rust_vec: Vec, + context: &mut Context, +) -> anyhow::Result { + let builder = JsArray::new(context); + + for (index, rust_string) in rust_vec.into_iter().enumerate() { + let js_string_value = JsString::from(rust_string); + builder + .set(index as u32, js_string_value, true, context) + .map_err(|e| anyhow::anyhow!(e.to_string()))?; + } + + Ok(builder.into()) +} + +#[allow(dead_code)] +pub fn js_call_to_string( + result: JsResult, + context: &mut Context, +) -> anyhow::Result { + let res = result + .map_err(|e| anyhow!("{}", e)) + .and_then(|f| f.as_promise().ok_or(anyhow!("Not a promise")))? + .await_blocking(context) + .map_err(|e| anyhow!("{}", e))? + .as_string() + .ok_or(anyhow!("No response string returned"))? + .to_std_string() + .map_err(|e| anyhow!("{}", e))?; + + Ok(res) +} + +pub fn js_call_to_json(result: JsResult, context: &mut Context) -> anyhow::Result { + let res = result + .map_err(|e| anyhow!("{}", e)) + .and_then(|f| f.as_promise().ok_or(anyhow!("Not a promise")))? + .await_blocking(context) + .map_err(|e| anyhow!("{}", e))?; + let ls = js_value_to_json(&res, context)?; + Ok(ls) +} + +pub fn js_call_to_void(result: JsResult, context: &mut Context) -> anyhow::Result<()> { + result + .map_err(|e| anyhow!("{}", e)) + .and_then(|f| f.as_promise().ok_or(anyhow!("Not a promise")))? + .await_blocking(context) + .map_err(|e| anyhow!("{}", e))?; + + Ok(()) +} + +/// Convert a `serde_json::Value` into a Boa `JsValue` +pub fn json_value_to_js(value: &Value, ctx: &mut Context) -> JsResult { + match value { + Value::Null => Ok(JsValue::null()), + Value::Bool(b) => Ok(JsValue::from(*b)), + Value::Number(n) => { + if let Some(i) = n.as_i64() { + Ok(JsValue::new(i)) + } else if let Some(f) = n.as_f64() { + Ok(JsValue::new(f)) + } else { + Ok(JsValue::null()) // fallback (rare) + } + } + Value::String(s) => Ok(JsValue::from(JsString::from(s.as_str()))), + + Value::Array(arr) => { + let js_arr = JsArray::new(ctx); + for (idx, item) in arr.iter().enumerate() { + let js_val = json_value_to_js(item, ctx)?; + js_arr.set(idx, js_val, false, ctx)?; + } + Ok(JsValue::from(js_arr)) + } + + Value::Object(obj) => { + let js_obj = JsObject::with_null_proto(); + + for (key, val) in obj { + let js_val = json_value_to_js(val, ctx)?; + js_obj.set(JsString::from(key.as_str()), js_val, true, ctx)?; + } + + Ok(JsValue::from(js_obj)) + } + } +} + +/// Convert a Boa `JsValue` into a `serde_json::Value` +pub fn js_value_to_json(value: &JsValue, ctx: &mut Context) -> anyhow::Result { + if value.is_null() || value.is_undefined() { + return Ok(Value::Null); + } + + if let Some(b) = value.as_boolean() { + return Ok(Value::Bool(b)); + } + + if let Some(n) = value.as_number() { + let num = serde_json::Number::from_f64(n).ok_or(anyhow!("Invalid number"))?; + return Ok(Value::Number(num)); + } + + if let Some(s) = value.as_string() { + let s = s.to_std_string().map_err(|e| anyhow!("{}", e))?; + return Ok(Value::String(s)); + } + + if value.is_bigint() { + // BigInts are NOT JSON-compatible → store as string + return Ok(Value::String(value.display().to_string())); + } + + if value.is_object() { + let obj = value.as_object().ok_or(anyhow!("Not an object"))?; + + // Array? + if obj.is_array() { + let obj = JsArray::from_object(obj).map_err(|e| anyhow!("{}", e))?; + let length = obj.length(ctx).map_err(|e| anyhow!("{}", e))?; + let mut json_arr = Vec::::with_capacity(length as usize); + + for i in 0..length { + let item = obj.get(i, ctx).unwrap_or(JsValue::null()); + let item_json = js_value_to_json(&item, ctx)?; + json_arr.push(item_json); + } + + return Ok(Value::Array(json_arr)); + } + + // Regular Object + let mut map = Map::::new(); + + for key in obj.own_property_keys(ctx).map_err(|e| anyhow!("{}", e))? { + let key_val: Option = match key.clone() { + PropertyKey::String(s) => Some(s.to_std_string().map_err(|e| anyhow!("{}", e))?), + PropertyKey::Index(i) => Some(serde_json::Number::from(i.get()).to_string()), + _ => None, + }; + + let v_js = obj.get(key, ctx).unwrap_or(JsValue::null()); + let v_json = js_value_to_json(&v_js, ctx)?; + + if let Some(key_val) = key_val { + map.insert(key_val, v_json); + } + } + + return Ok(Value::Object(map)); + } + + // Fallback for unsupported JS types: functions, symbols, etc. + Ok(Value::Null) +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index cbb071f8..0fa26645 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,2 +1,3 @@ pub mod api; mod frb_generated; +mod internal; \ No newline at end of file diff --git a/rust/src/main.rs b/rust/src/main.rs new file mode 100644 index 00000000..9cf68c35 --- /dev/null +++ b/rust/src/main.rs @@ -0,0 +1,48 @@ +pub mod api; +pub mod internal; +pub mod frb_generated; +use api::plugin::models::core::{PluginAbility, PluginConfiguration}; +use api::plugin::plugin::SpotubePlugin; + +const PLUGIN_JS: &str = "\ +class Core { + async checkUpdate() { + console.log('Core checkUpdate'); + } + support() { + return 'Metadata'; + } +} + +class TestingPlugin { + constructor() { + this.core = new Core(); + } +} +"; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let sp_plugin = SpotubePlugin::new(); + let sender = SpotubePlugin::new_context( + PLUGIN_JS.to_string(), + PluginConfiguration { + entry_point: "TestingPlugin".to_string(), + abilities: vec![PluginAbility::Metadata], + apis: vec![], + author: "KRTirtho".to_string(), + description: "Testing Plugin".to_string(), + name: "Testing Plugin".to_string(), + plugin_api_version: "2.0.0".to_string(), + repository: None, + version: "0.1.0".to_string(), + } + )?; + let result = sp_plugin.core.support(sender.clone()).await?; + + println!("Result: {:?}", result); + + sp_plugin.dispose(sender.clone()).await?; + + Ok(()) +}