github.com/alimy/mir/v4@v4.1.0/assert/assert.go (about)

     1  // Copyright 2023 Michael Li <alimy@gility.net>. All rights reserved.
     2  // Use of this source code is governed by Apache License 2.0 that
     3  // can be found in the LICENSE file.
     4  
     5  package assert
     6  
     7  import (
     8  	"github.com/alimy/mir/v4"
     9  )
    10  
    11  var (
    12  	_typeAssertor TypeAssertor = anyTypeAssertor[fakeType]{}
    13  )
    14  
    15  // fakeType just a fake type for default type assertor
    16  type fakeType struct{}
    17  
    18  // Binding[T] binding interface for custom T context
    19  type Binding[T any] interface {
    20  	Bind(T) mir.Error
    21  }
    22  
    23  // Binding2[R, P] binding interface for custom R, P context
    24  type Binding2[R, P any] interface {
    25  	Bind(R, P) mir.Error
    26  }
    27  
    28  // Render[T] render interface for custom T context
    29  type Render[T any] interface {
    30  	Render(T)
    31  }
    32  
    33  // Render[C, T] render interface for custom C, T context
    34  type Render2[C, T any] interface {
    35  	Render(C, T)
    36  }
    37  
    38  // TypeAssertor type assert for Binding and Render interface
    39  type TypeAssertor interface {
    40  	AssertBinding(any) bool
    41  	AssertRender(any) bool
    42  }
    43  
    44  // Register register custom TypeAssertor to assert Binding/Render interface
    45  func Register(ta TypeAssertor) {
    46  	_typeAssertor = ta
    47  }
    48  
    49  // RegisterType[T] register custom TypeAssertor to assert Binding[T]/Render[T] interface
    50  func RegisterType[T any]() {
    51  	_typeAssertor = anyTypeAssertor[T]{}
    52  }
    53  
    54  // RegisterType2[B, R] register custom TypeAssertor to assert Binding[B]/Render[R] interface
    55  func RegisterType2[B, R any]() {
    56  	_typeAssertor = anyTypeAssertor2[B, R]{}
    57  }
    58  
    59  // RegisterType2[B, P, R] register custom TypeAssertor to assert Binding[B]/Render[R] interface
    60  func RegisterType3[B, P, R any]() {
    61  	_typeAssertor = anyTypeAssertor3[B, P, R]{}
    62  }
    63  
    64  // RegisterType4[C, T] register custom TypeAssertor to assert C, T interface
    65  func RegisterType4[C, T any]() {
    66  	_typeAssertor = anyTypeAssertor4[C, T]{}
    67  }
    68  
    69  // AssertBinding assert Binding interface for obj
    70  func AssertBinding(obj any) bool {
    71  	return _typeAssertor.AssertBinding(obj)
    72  }
    73  
    74  // AssertRender assert Render interface for obj
    75  func AssertRender(obj any) bool {
    76  	return _typeAssertor.AssertRender(obj)
    77  }