From: Ben Beltran Date: Thu, 18 May 2017 04:06:25 +0000 (-0500) Subject: Add the arguments source X-Git-Tag: 0.1.0^2~3^2~3 X-Git-Url: https://git.r.bdr.sh/rbdr/lyricli/commitdiff_plain/4425e9001e20e891dab7711644f83a1628788b47?ds=sidebyside;hp=1f7088f6391dfbffcd8f243f8d1509be8a209604 Add the arguments source --- diff --git a/Sources/Lyricli.swift b/Sources/Lyricli.swift index 6c73e02..d55b500 100644 --- a/Sources/Lyricli.swift +++ b/Sources/Lyricli.swift @@ -3,7 +3,16 @@ public class Lyricli { public static var version = "0.0.0-feature/option-parsing" public static func printLyrics() { - print("Getting Lyrics: Not yet implemented") + + let sourceManager = SourceManager() + + if let currentTrack = sourceManager.currentTrack { + print(currentTrack.artist) + print(currentTrack.name) + } + else { + print("Current track not found") + } } public static func printTitle() { diff --git a/Sources/arguments_source.swift b/Sources/arguments_source.swift new file mode 100644 index 0000000..c07c952 --- /dev/null +++ b/Sources/arguments_source.swift @@ -0,0 +1,17 @@ +/// Source that deals with command line +class ArgumentsSource: Source { + public var currentTrack: Track? { + get { + if CommandLine.arguments.count >= 3 { + + // expected usage: $ ./lyricli + + let trackName: String = CommandLine.arguments[2] + let trackArtist: String = CommandLine.arguments[1] + + return Track(withName: trackName, andArtist: trackArtist) + } + return nil + } + } +} diff --git a/Sources/configuration.swift b/Sources/configuration.swift new file mode 100644 index 0000000..f5e4b0f --- /dev/null +++ b/Sources/configuration.swift @@ -0,0 +1,62 @@ +import Foundation + +/// Handles reading and writing the configuration +public class Configuration { + + let configurationPath = NSString(string: "~/.lyricli.conf").expandingTildeInPath + + // The defaults are added here + + private var configuration: [String: Any] = [ + "enabled_sources": ["arguments"], + "default": true + ] + + static let sharedInstance: Configuration = Configuration() + + private init() { + + // Read the config file and attempt toset any of the values. Otherwise + // Don't do anything. + // IMPROVEMENT: Enable a debug mode + + if let data = try? NSData(contentsOfFile: configurationPath) as Data { + if let parsedConfig = try? JSONSerialization.jsonObject(with: data) as! [String:Any] { + for (key, value) in parsedConfig { + + if key == "enabled_sources" { + configuration[key] = value as! [String] + } + else { + configuration[key] = value as! String + } + } + } + } + + writeConfiguration() + } + + private func writeConfiguration() { + + var error: NSError? + + if let outputStream = OutputStream(toFileAtPath: configurationPath, append: false) { + outputStream.open() + JSONSerialization.writeJSONObject(configuration, to: outputStream, options: [JSONSerialization.WritingOptions.prettyPrinted], error: &error) + outputStream.close() + } + } + + // Allow access as an object + subscript(index: String) -> Any? { + get { + return configuration[index] + } + + set(newValue) { + configuration[index] = newValue + writeConfiguration() + } + } +} diff --git a/Sources/main.swift b/Sources/main.swift index 47720ad..0ae48bc 100644 --- a/Sources/main.swift +++ b/Sources/main.swift @@ -84,6 +84,10 @@ func main() { } } + // Remove any flags so anyone after this gets the unprocessed values + let programName: [String] = [CommandLine.arguments[0]] + CommandLine.arguments = programName + parser.unparsedArguments + Lyricli.printLyrics() } diff --git a/Sources/source_manager.swift b/Sources/source_manager.swift new file mode 100644 index 0000000..d0af817 --- /dev/null +++ b/Sources/source_manager.swift @@ -0,0 +1,52 @@ +/// Manages the different sources. Keeps track of them, lists and toggles +public class SourceManager { + + private var availableSources: [String: Source] = [ + "arguments": ArgumentsSource() + ] + + var currentTrack: Track? { + get { + + for source in enabledSources { + if let currentTrack = source.currentTrack { + return currentTrack + } + } + + return nil + } + } + + var enabledSources: [Source] { + + // Checks the config and returns an array of sources based on the + // enabled and available ones + + get { + var sources = [Source]() + + if let sourceNames = Configuration.sharedInstance["enabled_sources"] as? [String]{ + for sourceName in sourceNames { + if let source = availableSources[sourceName] { + sources.append(source) + } + } + } + + return sources + } + } + + func enable(sourceName: String) { + } + + func disable(sourceName: String) { + } + + func reset(sourceName: String) { + } + + func getSources(sourceName: String) { + } +} diff --git a/Sources/source_protocol.swift b/Sources/source_protocol.swift new file mode 100644 index 0000000..ee9350c --- /dev/null +++ b/Sources/source_protocol.swift @@ -0,0 +1,3 @@ +protocol Source { + var currentTrack: Track? { get } +} diff --git a/Sources/track.swift b/Sources/track.swift new file mode 100644 index 0000000..efc09f4 --- /dev/null +++ b/Sources/track.swift @@ -0,0 +1,11 @@ +/// Contains the artist and name of a track +public class Track { + public let name: String + public let artist: String + + init(withName trackName: String, andArtist trackArtist: String) { + + name = trackName + artist = trackArtist + } +}