github.com/influx6/npkg@v0.8.8/npkg.go (about) 1 package npkg 2 3 import ( 4 "errors" 5 "time" 6 ) 7 8 const ( 9 // DEBUGKey defines the key/flag name used to identify whether 10 // debugging mode is on. 11 DEBUGKey = "DEBUG" 12 13 // TRACEKey defines the key/flag name used to identify whether 14 // tracing is enabled. 15 TRACEKey = "TRACE_ENABLED" 16 ) 17 18 var ( 19 // ErrUndecodable is returned when type can not be encoded automatically. 20 ErrUndecodable = errors.New("value can not be decoded to and does not implement DecodableObject/List interface") 21 ) 22 23 //************************************************************ 24 // Getters 25 //************************************************************ 26 27 // Getter embodies what we expect from setting/configuration provider getters. 28 type Getter interface { 29 Has(name string) bool 30 31 Int(string) int 32 Bool(string) bool 33 Int8(string) int8 34 Int16(string) int16 35 Int32(string) int32 36 Int64(string) int64 37 Float32(string) float32 38 Float64(string) float64 39 String(name string) string 40 Duration(string) time.Duration 41 Interface(string) interface{} 42 } 43 44 //************************************************************ 45 // Decoder 46 //************************************************************ 47 48 // DecodableObject defines what we expect the a decodable type for object should provide. 49 type DecodableObject interface { 50 DecodeKey(decoder Decoder, k string) error 51 } 52 53 // DecodableList defines what we expect the a decodable type for list should provide. 54 type DecodableList interface { 55 DecodeIndex(decoder Decoder, index int64, total int64) error 56 } 57 58 // Decoder defines an interface for what we expect a object decoder 59 // to provide for key value pairs. 60 type Decoder interface { 61 Int(v *int) error 62 UInt(v *uint) error 63 Bool(v *bool) error 64 Int8(v *int8) error 65 Hex(v *string) error 66 UInt8(v *uint8) error 67 Int16(v *int16) error 68 UInt16(v *uint16) error 69 Int32(v *int32) error 70 UInt32(v *uint32) error 71 Int64(v *int64) error 72 UInt64(v *uint64) error 73 String(v *string) error 74 Float64(v *float64) error 75 Float32(v *float32) error 76 Base64(v *int64, bs int) error 77 78 List(DecodableList) error 79 Object(DecodableObject) error 80 } 81 82 // Decode attempts to as best as possible decode giving value in 83 // decoder to provided interface object of matching type. 84 // If it fails to, it returns an error. 85 func Decode(dec Decoder, v interface{}) error { 86 var err error 87 switch vt := v.(type) { 88 case *string: 89 err = dec.String(vt) 90 case **string: 91 if vt == nil { 92 *vt = new(string) 93 } 94 err = dec.String(*vt) 95 case *int: 96 err = dec.Int(vt) 97 case **int: 98 if vt == nil { 99 *vt = new(int) 100 } 101 err = dec.Int(*vt) 102 case *int8: 103 err = dec.Int8(vt) 104 case **int8: 105 if vt == nil { 106 *vt = new(int8) 107 } 108 err = dec.Int8(*vt) 109 case *int16: 110 err = dec.Int16(vt) 111 case **int16: 112 if vt == nil { 113 *vt = new(int16) 114 } 115 err = dec.Int16(*vt) 116 case *int32: 117 err = dec.Int32(vt) 118 case **int32: 119 if vt == nil { 120 *vt = new(int32) 121 } 122 err = dec.Int32(*vt) 123 case *int64: 124 err = dec.Int64(vt) 125 case **int64: 126 if vt == nil { 127 *vt = new(int64) 128 } 129 err = dec.Int64(*vt) 130 case *uint8: 131 err = dec.UInt8(vt) 132 case **uint8: 133 if vt == nil { 134 *vt = new(uint8) 135 } 136 err = dec.UInt8(*vt) 137 case *uint16: 138 err = dec.UInt16(vt) 139 case **uint16: 140 if vt == nil { 141 *vt = new(uint16) 142 } 143 err = dec.UInt16(*vt) 144 case *uint32: 145 err = dec.UInt32(vt) 146 case **uint32: 147 if vt == nil { 148 *vt = new(uint32) 149 } 150 err = dec.UInt32(*vt) 151 case *uint64: 152 err = dec.UInt64(vt) 153 case **uint64: 154 if vt == nil { 155 *vt = new(uint64) 156 } 157 err = dec.UInt64(*vt) 158 case *float64: 159 err = dec.Float64(vt) 160 case **float64: 161 if vt == nil { 162 *vt = new(float64) 163 } 164 err = dec.Float64(*vt) 165 case *float32: 166 err = dec.Float32(vt) 167 case **float32: 168 if vt == nil { 169 *vt = new(float32) 170 } 171 err = dec.Float32(*vt) 172 case *bool: 173 err = dec.Bool(vt) 174 case **bool: 175 if vt == nil { 176 *vt = new(bool) 177 } 178 err = dec.Bool(*vt) 179 case DecodableObject: 180 err = dec.Object(vt) 181 case DecodableList: 182 err = dec.List(vt) 183 default: 184 err = ErrUndecodable 185 } 186 return err 187 } 188 189 type Error interface { 190 Err() error 191 } 192 193 // Encoder defines what we expect from a encoder of object and list elements . 194 type Encoder interface { 195 Error 196 ObjectEncoderMethods 197 ListEncoderMethods 198 } 199 200 // Encodable defines a type which exposes a method to encode it's internals 201 // with provided encoder. 202 type Encodable interface { 203 Encode(encoder Encoder) error 204 } 205 206 // EncodableObject defines what we expect the a Encodable type should provide. 207 type EncodableObject interface { 208 EncodeObject(encoder ObjectEncoder) 209 } 210 211 // EncodableList defines what we expect the a Encodable list type should provide. 212 type EncodableList interface { 213 EncodeList(encoder ListEncoder) 214 } 215 216 // ObjectEncoder embodies what is expected from a encoding type 217 // implementing key-value pair encoding. 218 type ObjectEncoder interface { 219 Error 220 ObjectEncoderMethods 221 } 222 223 type ObjectEncoderMethods interface { 224 Int(k string, v int) 225 UInt(k string, v uint) 226 Bool(k string, v bool) 227 Int8(k string, v int8) 228 Hex(k string, v string) 229 UInt8(k string, v uint8) 230 Int16(k string, v int16) 231 UInt16(k string, v uint16) 232 Int32(k string, v int32) 233 UInt32(k string, v uint32) 234 Int64(k string, v int64) 235 UInt64(k string, v uint64) 236 String(k string, v string) 237 Error(k string, v error) 238 Bytes(k string, v []byte) 239 Float64(k string, v float64) 240 Float32(k string, v float32) 241 Base64(k string, v int64, b int) 242 Map(k string, v map[string]interface{}) 243 StringMap(k string, v map[string]string) 244 Formatted(k string, format string, v interface{}) 245 246 List(k string, list EncodableList) 247 Object(k string, object EncodableObject) 248 ObjectFor(k string, fx func(ObjectEncoder)) 249 ListFor(k string, fx func(ListEncoder)) 250 } 251 252 // ListEncoder defines an interface which defines methods for items into 253 // a underline list encoding. 254 type ListEncoder interface { 255 Error 256 ListEncoderMethods 257 } 258 259 type ListEncoderMethods interface { 260 AddInt(v int) 261 AddBool(v bool) 262 AddUInt(v uint) 263 AddInt8(v int8) 264 AddInt16(v int16) 265 AddInt32(v int32) 266 AddByte(v byte) 267 AddInt64(v int64) 268 AddUInt8(v uint8) 269 AddUInt16(v uint16) 270 AddUInt32(v uint32) 271 AddUInt64(v uint64) 272 AddString(v string) 273 AddError(v error) 274 AddFloat64(v float64) 275 AddFloat32(v float32) 276 AddBase64(v int64, b int) 277 AddMap(v map[string]interface{}) 278 AddStringMap(v map[string]string) 279 AddFormatted(format string, v interface{}) 280 281 AddList(list EncodableList) 282 AddObject(object EncodableObject) 283 AddObjectWith(fn func(encoder ObjectEncoder)) 284 AddListWith(fn func(encoder ListEncoder)) 285 } 286 287 // EncodeKV encodes a giving key-value pair into provided encoder based 288 func EncodeKV(enc ObjectEncoder, k string, v interface{}) error { 289 switch vt := v.(type) { 290 case EncodableObject: 291 enc.Object(k, vt) 292 case EncodableList: 293 enc.List(k, vt) 294 case map[string]string: 295 enc.StringMap(k, vt) 296 case map[string]interface{}: 297 enc.Map(k, vt) 298 case string: 299 enc.String(k, vt) 300 case bool: 301 enc.Bool(k, vt) 302 case int: 303 enc.Int(k, vt) 304 case uint: 305 enc.UInt(k, vt) 306 case int64: 307 enc.Int64(k, vt) 308 case int32: 309 enc.Int32(k, vt) 310 case int16: 311 enc.Int16(k, vt) 312 case int8: 313 enc.Int8(k, vt) 314 case uint64: 315 enc.UInt64(k, vt) 316 case uint32: 317 enc.UInt32(k, vt) 318 case uint16: 319 enc.UInt16(k, vt) 320 case uint8: 321 enc.UInt8(k, vt) 322 case float64: 323 enc.Float64(k, vt) 324 case float32: 325 enc.Float32(k, vt) 326 case error: 327 enc.Error(k, vt) 328 } 329 return enc.Err() 330 } 331 332 // EncodeList encodes a giving key-value pair into provided encoder based 333 func EncodeList(enc ListEncoder, v interface{}) error { 334 switch vt := v.(type) { 335 case EncodableObject: 336 enc.AddObject(vt) 337 case EncodableList: 338 enc.AddList(vt) 339 case map[string]string: 340 enc.AddStringMap(vt) 341 case map[string]interface{}: 342 enc.AddMap(vt) 343 case string: 344 enc.AddString(vt) 345 case bool: 346 enc.AddBool(vt) 347 case error: 348 enc.AddError(vt) 349 case int: 350 enc.AddInt(vt) 351 case uint: 352 enc.AddUInt(vt) 353 case int64: 354 enc.AddInt64(vt) 355 case int32: 356 enc.AddInt32(vt) 357 case int16: 358 enc.AddInt16(vt) 359 case int8: 360 enc.AddInt8(vt) 361 case uint64: 362 enc.AddUInt64(vt) 363 case uint32: 364 enc.AddUInt32(vt) 365 case uint16: 366 enc.AddUInt16(vt) 367 case uint8: 368 enc.AddUInt8(vt) 369 case float64: 370 enc.AddFloat64(vt) 371 case float32: 372 enc.AddFloat32(vt) 373 } 374 return enc.Err() 375 } 376 377 // EncodableMapList defines a map type which implements the EncodableList interface. 378 // It attempts to encode all properties accordingly else returns an error in regard's 379 // giving failure. 380 type EncodableMapList []map[string]interface{} 381 382 // EncodableMap implements the EncodableList interface. 383 func (enc EncodableMapList) EncodeList(encoder ListEncoder) { 384 for _, value := range enc { 385 encoder.AddObject(EncodableMap(value)) 386 } 387 } 388 389 type EncodedAnyList []interface{} 390 391 func (enc EncodedAnyList) EncodeList(encoder ListEncoder) { 392 for _, value := range enc { 393 _ = EncodeList(encoder, value) 394 } 395 } 396 397 type EncodedList []string 398 399 func (enc EncodedList) EncodeList(encoder ListEncoder) { 400 for _, value := range enc { 401 _ = EncodeList(encoder, value) 402 } 403 } 404 405 // EncodableMap defines a map type which implements the EncodableObject interface. 406 // It attempts to encode all properties accordingly else returns an error in regard's 407 // giving failure. 408 type EncodableMap map[string]interface{} 409 410 // EncodableMap implements the EncodableObject interface. 411 func (enc EncodableMap) EncodeObject(encoder ObjectEncoder) { 412 for key, value := range enc { 413 _ = EncodeKV(encoder, key, value) 414 } 415 } 416 417 type EncodableStringListMap map[string][]string 418 419 func (enc EncodableStringListMap) EncodeObject(encoder ObjectEncoder) { 420 for key, value := range enc { 421 func(k string, vals []string) { 422 encoder.ListFor(k, func(le ListEncoder) { 423 for _, val := range vals { 424 le.AddString(val) 425 } 426 }) 427 }(key, value) 428 } 429 } 430 431 // EncodableMap defines a map type which implements the EncodableObject interface. 432 // It attempts to encode all properties accordingly else returns an error in regard's 433 // giving failure. 434 type EncodableStringMap map[string]string 435 436 // EncodableMap implements the EncodableObject interface. 437 func (enc EncodableStringMap) EncodeObject(encoder ObjectEncoder) { 438 for key, value := range enc { 439 _ = EncodeKV(encoder, key, value) 440 } 441 } 442 443 type Encoded interface{} 444 445 type EncodableObjectFunc func() Encoder 446 447 type Writer interface { 448 Write(Encoded) 449 } 450 451 // WriteStack implements a simple chainable wrapper around the encodable object which it sends to a Writer 452 // when New or End is called. 453 // 454 // It is not thread-safe to call New or End. 455 type WriteStack struct { 456 writer Writer 457 maker EncodableObjectFunc 458 base Encoder 459 } 460 461 func NewWriteStack(fn EncodableObjectFunc, writer Writer) *WriteStack { 462 return &WriteStack{ 463 writer: writer, 464 maker: fn, 465 } 466 } 467 468 func (l *WriteStack) SetWriter(w Writer) *WriteStack { 469 l.writer = w 470 return l 471 } 472 473 func (l *WriteStack) New() *WriteStack { 474 l.End() 475 l.base = l.maker() 476 return l 477 } 478 479 func (l *WriteStack) End() *WriteStack { 480 if l.base == nil { 481 return l 482 } 483 l.writer.Write(l.base) 484 l.base = nil 485 return l 486 } 487 488 func (l *WriteStack) Formatted(k string, format string, v interface{}) *WriteStack { 489 l.base.Formatted(k, format, v) 490 return l 491 } 492 493 func (l *WriteStack) AddFormatted(format string, v interface{}) *WriteStack { 494 l.base.AddFormatted(format, v) 495 return l 496 } 497 498 type LogLevel int 499 500 const ( 501 DEBUG LogLevel = 10 502 INFO LogLevel = 20 503 ERROR LogLevel = 40 504 WARN LogLevel = 60 505 CRITICAL LogLevel = 80 506 PANIC LogLevel = 120 507 ) 508 509 func (l *WriteStack) LInfo() *WriteStack { 510 return l.Level(INFO) 511 } 512 513 func (l *WriteStack) LError() *WriteStack { 514 return l.Level(ERROR) 515 } 516 517 func (l *WriteStack) LDebug() *WriteStack { 518 return l.Level(DEBUG) 519 } 520 521 func (l *WriteStack) LCritical() *WriteStack { 522 return l.Level(CRITICAL) 523 } 524 525 func (l *WriteStack) LPanic() *WriteStack { 526 return l.Level(PANIC) 527 } 528 529 func (l *WriteStack) LWarn() *WriteStack { 530 return l.Level(WARN) 531 } 532 533 func (l *WriteStack) Level(level LogLevel) *WriteStack { 534 l.Int("_level", int(level)) 535 return l 536 } 537 538 func (l *WriteStack) Message(msg string) *WriteStack { 539 l.String("_message", msg) 540 return l 541 } 542 543 func (l *WriteStack) AddInt(v int) *WriteStack { 544 l.base.AddInt(v) 545 return l 546 } 547 548 func (l *WriteStack) AddBool(v bool) *WriteStack { 549 l.base.AddBool(v) 550 return l 551 } 552 553 func (l *WriteStack) AddUInt(v uint) *WriteStack { 554 l.base.AddUInt(v) 555 return l 556 } 557 558 func (l *WriteStack) AddInt8(v int8) *WriteStack { 559 l.base.AddInt8(v) 560 return l 561 } 562 563 func (l *WriteStack) AddInt16(v int16) *WriteStack { 564 l.base.AddInt16(v) 565 return l 566 } 567 568 func (l *WriteStack) AddInt32(v int32) *WriteStack { 569 l.base.AddInt32(v) 570 return l 571 } 572 573 func (l *WriteStack) AddByte(v byte) *WriteStack { 574 l.base.AddByte(v) 575 return l 576 } 577 578 func (l *WriteStack) AddInt64(v int64) *WriteStack { 579 l.base.AddInt64(v) 580 return l 581 } 582 583 func (l *WriteStack) AddUInt8(v uint8) *WriteStack { 584 l.base.AddUInt8(v) 585 return l 586 } 587 588 func (l *WriteStack) AddUInt16(v uint16) *WriteStack { 589 l.base.AddUInt16(v) 590 return l 591 } 592 593 func (l *WriteStack) AddUInt32(v uint32) *WriteStack { 594 l.base.AddUInt32(v) 595 return l 596 } 597 598 func (l *WriteStack) AddUInt64(v uint64) *WriteStack { 599 l.base.AddUInt64(v) 600 return l 601 } 602 603 func (l *WriteStack) AddError(v error) *WriteStack { 604 l.base.AddError(v) 605 return l 606 } 607 608 func (l *WriteStack) AddString(v string) *WriteStack { 609 l.base.AddString(v) 610 return l 611 } 612 613 func (l *WriteStack) AddFloat64(v float64) *WriteStack { 614 l.base.AddFloat64(v) 615 return l 616 } 617 618 func (l *WriteStack) AddFloat32(v float32) *WriteStack { 619 l.base.AddFloat32(v) 620 return l 621 } 622 623 func (l *WriteStack) AddBase64(v int64, b int) *WriteStack { 624 l.base.AddBase64(v, b) 625 return l 626 } 627 628 func (l *WriteStack) AddMap(v map[string]interface{}) *WriteStack { 629 l.base.AddMap(v) 630 return l 631 } 632 633 func (l *WriteStack) AddStringMap(v map[string]string) *WriteStack { 634 l.base.AddStringMap(v) 635 return l 636 } 637 638 func (l *WriteStack) AddList(v EncodableList) *WriteStack { 639 l.base.AddList(v) 640 return l 641 } 642 643 func (l *WriteStack) AddObject(v EncodableObject) *WriteStack { 644 l.base.AddObject(v) 645 return l 646 } 647 648 func (l *WriteStack) AddObjectWith(fn func(encoder ObjectEncoder)) *WriteStack { 649 l.base.AddObjectWith(fn) 650 return l 651 } 652 653 func (l *WriteStack) AddListWith(fn func(encoder ListEncoder)) *WriteStack { 654 l.base.AddListWith(fn) 655 return l 656 } 657 658 func (l *WriteStack) Err() error { 659 if l.base == nil { 660 return nil 661 } 662 return l.base.Err() 663 } 664 665 func (l *WriteStack) Int(k string, v int) *WriteStack { 666 l.base.Int(k, v) 667 return l 668 } 669 670 func (l *WriteStack) UInt(k string, v uint) *WriteStack { 671 l.base.UInt(k, v) 672 return l 673 } 674 675 func (l *WriteStack) Bool(k string, v bool) *WriteStack { 676 l.base.Bool(k, v) 677 return l 678 } 679 680 func (l *WriteStack) Int8(k string, v int8) *WriteStack { 681 l.base.Int8(k, v) 682 return l 683 } 684 685 func (l *WriteStack) Hex(k string, v string) *WriteStack { 686 l.base.Hex(k, v) 687 return l 688 } 689 690 func (l *WriteStack) UInt8(k string, v uint8) *WriteStack { 691 l.base.UInt8(k, v) 692 return l 693 } 694 695 func (l *WriteStack) Int16(k string, v int16) *WriteStack { 696 l.base.Int16(k, v) 697 return l 698 } 699 700 func (l *WriteStack) UInt16(k string, v uint16) *WriteStack { 701 l.base.UInt16(k, v) 702 return l 703 } 704 705 func (l *WriteStack) Int32(k string, v int32) *WriteStack { 706 l.base.Int32(k, v) 707 return l 708 } 709 710 func (l *WriteStack) UInt32(k string, v uint32) *WriteStack { 711 l.base.UInt32(k, v) 712 return l 713 } 714 715 func (l *WriteStack) Int64(k string, v int64) *WriteStack { 716 l.base.Int64(k, v) 717 return l 718 } 719 720 func (l *WriteStack) UInt64(k string, v uint64) *WriteStack { 721 l.base.UInt64(k, v) 722 return l 723 } 724 725 func (l *WriteStack) String(k string, v string) *WriteStack { 726 l.base.String(k, v) 727 return l 728 } 729 730 func (l *WriteStack) Error(k string, v error) *WriteStack { 731 l.base.Error(k, v) 732 return l 733 } 734 735 func (l *WriteStack) Bytes(k string, v []byte) *WriteStack { 736 l.base.Bytes(k, v) 737 return l 738 } 739 740 func (l *WriteStack) Float64(k string, v float64) *WriteStack { 741 l.base.Float64(k, v) 742 return l 743 } 744 745 func (l *WriteStack) Float32(k string, v float32) *WriteStack { 746 l.base.Float32(k, v) 747 return l 748 } 749 750 func (l *WriteStack) Base64(k string, v int64, b int) *WriteStack { 751 l.base.Base64(k, v, b) 752 return l 753 } 754 755 func (l *WriteStack) Map(k string, v map[string]interface{}) *WriteStack { 756 l.base.Map(k, v) 757 return l 758 } 759 760 func (l *WriteStack) StringMap(k string, v map[string]string) *WriteStack { 761 l.base.StringMap(k, v) 762 return l 763 } 764 765 func (l *WriteStack) List(k string, list EncodableList) *WriteStack { 766 l.base.List(k, list) 767 return l 768 } 769 770 func (l *WriteStack) Object(k string, object EncodableObject) *WriteStack { 771 l.base.Object(k, object) 772 return l 773 } 774 775 func (l *WriteStack) ObjectFor(k string, fx func(ObjectEncoder)) *WriteStack { 776 l.base.ObjectFor(k, fx) 777 return l 778 } 779 780 func (l *WriteStack) ListFor(k string, fx func(ListEncoder)) *WriteStack { 781 l.base.ListFor(k, fx) 782 return l 783 }