]> git.r.bdr.sh - rbdr/lyricli/commitdiff
Add the arguments source
authorBen Beltran <redacted>
Thu, 18 May 2017 04:06:25 +0000 (23:06 -0500)
committerBen Beltran <redacted>
Thu, 18 May 2017 04:06:25 +0000 (23:06 -0500)
Sources/Lyricli.swift
Sources/arguments_source.swift [new file with mode: 0644]
Sources/configuration.swift [new file with mode: 0644]
Sources/main.swift
Sources/source_manager.swift [new file with mode: 0644]
Sources/source_protocol.swift [new file with mode: 0644]
Sources/track.swift [new file with mode: 0644]

index 6c73e028e2ae23a0f8057ee0d5d594b4ba1c00ba..d55b500af960bb8b39c5c571ea78fbe91bec4aff 100644 (file)
@@ -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 (file)
index 0000000..c07c952
--- /dev/null
@@ -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 <artist> <name>
+
+                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 (file)
index 0000000..f5e4b0f
--- /dev/null
@@ -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()
+        }
+    }
+}
index 47720ad3a631b15d7feed0637520a729bf3c8662..0ae48bcd891837259fa344cfb4c14feb394e2651 100644 (file)
@@ -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 (file)
index 0000000..d0af817
--- /dev/null
@@ -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 (file)
index 0000000..ee9350c
--- /dev/null
@@ -0,0 +1,3 @@
+protocol Source {
+    var currentTrack: Track? { get }
+}
diff --git a/Sources/track.swift b/Sources/track.swift
new file mode 100644 (file)
index 0000000..efc09f4
--- /dev/null
@@ -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
+    }
+}