//
//  MethodShimUtils.swift
//  Astro
//
//  Created by Mark Sandstrom on 5/5/15.
//  Copyright (c) 2015 Mobify Research & Development Inc. All rights reserved.
//

import Foundation

public struct MethodShimUtils {
    public static func getArg<T>(_ params: JSONObject, key: String, respond: RPCMethodCallback) -> T? {
        if let value = params[key] {
            if let value = value as? T {
                return value
            } else if value is NSNull {
                // TODO: we need to use another sentinel value if we actually want to use null
                // as a valid value at some point.
                respond(.error("\"\(key)\" is required, but got null"))
            } else {
                respond(.error("\"\(key)\" is not a \"\(T.self)\""))
            }
        } else {
            respond(.error("\"\(key)\" not present"))
        }

        return nil
    }

    public static func getOptionalArg<T>(_ params: JSONObject, key: String, respond: RPCMethodCallback) -> T?? {
        if let value = params[key] {
            if let value = value as? T {
                return value
            } else if value is NSNull {
                return Optional(Optional<T>.none)
            } else {
                respond(.error("\"\(key)\" is not a \"\(T.self)\""))
            }
        } else {
            respond(.error("\"\(key)\" not present"))
        }

        return nil
    }
}
