OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / Debug.swift
1 //
2 //  Debug.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/12.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 final class Debug {
12     
13     enum Level: Int {
14         
15         case none
16         
17         case test
18         
19         case debug
20         
21         case full
22         
23         func higher(other: Level) -> Bool {
24             
25             return self.rawValue >= other.rawValue
26         }
27     }
28     
29     private struct Args: CustomStringConvertible, CustomDebugStringConvertible {
30         
31         let args: [Any]
32         let separator: String
33         
34         var description: String {
35             
36             return args.map { "\($0)" }.joined(separator: separator)
37         }
38         
39         var debugDescription: String {
40             
41             return args
42                 .map { ($0 as? CustomDebugStringConvertible)?.debugDescription ?? "\($0)" }
43                 .joined(separator: separator)
44         }
45     }
46     
47     class func print(_ items: Any..., separator: String = " ", terminator: String = "\n", level: Level = .debug) {
48         
49             excute(level: level) {
50                 
51                 Swift.print(Args(args: items, separator: separator), separator: separator, terminator: terminator)
52             }
53     }
54     
55     class func debugPrint(_ items: Any..., separator: String = " ", terminator: String = "\n", level: Level = .debug) {
56         
57             excute(level: level) {
58                 
59                 Swift.debugPrint(Args(args: items, separator: separator), separator: separator, terminator: terminator)
60             }
61     }
62     
63     class func dump<T>(_ value: T, name: String? = nil, indent: Int = 0, maxDepth: Int = Int.max, maxItems: Int = Int.max) -> T {
64         
65         #if DEBUG
66         
67             return Swift.dump(value, name: name, indent: indent, maxDepth: maxDepth, maxItems: maxItems)
68         
69         #else
70         
71             return value
72         
73         #endif
74     }
75     
76     class func excute(level: Level, f: () -> Void) {
77         
78         if UserDefaults.standard[.degugPrintLevel].higher(other: level) {
79             
80             f()
81         }
82     }
83 }