diff --git a/lib/parsing/parser.dart b/lib/parsing/parser.dart index 7960001..0786a0c 100644 --- a/lib/parsing/parser.dart +++ b/lib/parsing/parser.dart @@ -47,6 +47,35 @@ ParseResult extract(final List args) { currentStage = stageResult.stage; result = stageResult.result; break; + + case ParsingStage.album: + final stageResult = _onEntityStage( + arg, + result, + currentStage, + FunkEntity.album, + ); + currentStage = stageResult.stage; + result = stageResult.result; + break; + + case ParsingStage.artist: + final stageResult = _onEntityStage( + arg, + result, + currentStage, + FunkEntity.artist, + ); + currentStage = stageResult.stage; + result = stageResult.result; + break; + + case ParsingStage.domain: + final stageResult = _onDomainStage(arg, result, currentStage); + currentStage = stageResult.stage; + result = stageResult.result; + break; + default: console.error('not implemented yet'); break; @@ -56,6 +85,58 @@ ParseResult extract(final List args) { return result; } +StageResult _onEntityStage( + final String arg, + final ParseResult previousResult, + final ParsingStage previousStage, + final FunkEntity kind, +) { + ParsingStage currentStage = previousStage; + ParseResult result = previousResult; + + if (int.tryParse(arg) != null) { + currentStage = ParsingStage.nothing; + result = ParseResult( + action: previousResult.action, + success: true, + object: FunkObject( + domain: previousResult.object?.domain ?? '', + id: arg, + kind: kind, + ), + ); + } + + return StageResult(result: result, stage: currentStage); +} + +StageResult _onDomainStage( + final String arg, + final ParseResult previousResult, + final ParsingStage previousStage, +) { + ParsingStage currentStage = previousStage; + ParseResult result = previousResult; + + try { + final Uri uri = Uri.parse(arg); + currentStage = ParsingStage.nothing; + result = ParseResult( + action: previousResult.action, + success: true, + object: FunkObject( + domain: uri.toString(), + id: previousResult.object?.id ?? '', + kind: previousResult.object?.kind ?? FunkEntity.album, + ), + ); + } catch (e) { + console.error(e.toString()); + } + + return StageResult(result: result, stage: currentStage); +} + StageResult _onNothingStage( final String arg, final ParseResult previousResult, @@ -80,6 +161,10 @@ StageResult _onNothingStage( case '--path': currentStage = ParsingStage.path; break; + case '-d': + case '--domain': + currentStage = ParsingStage.domain; + break; default: try { final Uri uri = Uri.parse(arg); diff --git a/lib/parsing/parsing_stage.dart b/lib/parsing/parsing_stage.dart index 706b41d..217f7d9 100644 --- a/lib/parsing/parsing_stage.dart +++ b/lib/parsing/parsing_stage.dart @@ -5,4 +5,5 @@ enum ParsingStage { song, path, upload, + domain, }