Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Malygos.swift
- // Malygos
- //
- // Created by xing jian on 11/7/2019.
- // Copyright © 2019 xingjian. All rights reserved.
- //
- import Foundation
- enum JoinType{
- case path
- case query
- }
- public protocol NetBean {
- static func createBean() -> NetBean?
- }
- extension NetBean{
- static func createBean() -> NetBean? {
- return nil
- }
- }
- protocol NetFunction {
- var beanPath:[(String,String?)]{get}
- var beanQuery:[(String,String?)]{get}
- func fillPathAndQuery(_ obj:Any)
- func paras(_ path:String,_ factor:Character)->[(String,String?)]
- }
- extension NetFunction{
- func paras(_ path:String,_ factor:Character)->[(String,String?)]{
- guard path.count > 0 else{
- return []
- }
- let tuple = path.split(separator: factor).compactMap { item -> String? in
- if item.count > 0 {
- return String(item)
- }
- return nil
- }.map { item -> (String,String?) in
- let pathitem = item.trimmingCharacters(in: .whitespaces)
- let findex = pathitem.firstIndex(of: "{")
- guard findex != nil else{
- return (pathitem,pathitem)
- }
- let lindex = pathitem.lastIndex(of: "}")
- guard lindex != nil else{
- return (pathitem,pathitem)
- }
- let varname = item[item.index(findex!, offsetBy:1)..<lindex!]
- return (String(varname),nil)
- }
- return tuple
- }
- }
- extension NetFunction{
- func fillPathAndQuery(_ obj:Any){
- func join(_ items:[(String,String?)],_ variables:[[String:Any]],_ type:JoinType) -> String{
- guard items.count > 0 else {
- return ""
- }
- let result = items.compactMap { item -> String? in
- guard item.1 == nil else{
- return item.0
- }
- var value :Any? = nil
- for varitem in variables{
- if let item = varitem[item.0]{
- value = item
- break;
- }
- }
- if value != nil {
- if let vstring = value as? String{
- return type == .path ? String(vstring) : String("\(item.0)=\(vstring)")
- }
- if let istring = value as? Int{
- return type == .path ? String(istring) : String("\(item.0)=\(istring)")
- }
- return nil
- }
- return nil
- }.joined(separator: type == .path ? "/":"&")
- return result
- }
- let ref = Mirror(reflecting:obj.self)
- let variables = ref.children.compactMap{ child ->[String:Any]? in
- if let lable = child.label{
- return [lable:child.value]
- }
- return nil
- }
- let newpath = join(beanPath, variables, .path)
- let newquery = join(beanQuery, variables, .query)
- }
- }
- @propertyDelegate
- public struct Get<Bean:NetBean>:NetFunction{
- private var valueInternal:Bean? = nil
- private(set) var beanPath:[(String,String?)] = []
- private(set) var beanQuery:[(String,String?)] = []
- public var value:Bean{
- set(newValue){valueInternal = newValue}
- get{
- let bean = valueInternal ?? Bean.createBean()! as! Bean
- fillPathAndQuery(bean)
- return bean
- }
- }
- public init(path:String="",query:String=""){
- beanPath = paras(path,"/")
- beanQuery = paras(query,"&")
- }
- }
- @propertyDelegate
- public struct Post<Bean:NetBean> {
- private var valueInternal:Bean? = nil
- public var value:Bean{
- set(newValue){ valueInternal = newValue}
- get{return valueInternal ?? Bean.createBean()! as! Bean}
- }
- public init(){
- }
- }
- @propertyDelegate
- public struct Put<Bean:NetBean> {
- private var valueInternal:Bean? = nil
- public var value:Bean{
- set(newValue){ valueInternal = newValue}
- get{return valueInternal ?? Bean.createBean()! as! Bean}
- }
- public init(){
- }
- }
- @propertyDelegate
- public struct Delete<Bean:NetBean> {
- private var valueInternal:Bean? = nil
- public var value:Bean{
- set(newValue){ valueInternal = newValue}
- get{return valueInternal ?? Bean.createBean()! as! Bean}
- }
- public init(){
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement