github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/vendor_skip/go.mongodb.org/mongo-driver/bson/bsonrw/mode.go (about)

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     6  
     7  package bsonrw
     8  
     9  import (
    10  	"fmt"
    11  )
    12  
    13  type mode int
    14  
    15  const (
    16  	_ mode = iota
    17  	mTopLevel
    18  	mDocument
    19  	mArray
    20  	mValue
    21  	mElement
    22  	mCodeWithScope
    23  	mSpacer
    24  )
    25  
    26  func (m mode) String() string {
    27  	var str string
    28  
    29  	switch m {
    30  	case mTopLevel:
    31  		str = "TopLevel"
    32  	case mDocument:
    33  		str = "DocumentMode"
    34  	case mArray:
    35  		str = "ArrayMode"
    36  	case mValue:
    37  		str = "ValueMode"
    38  	case mElement:
    39  		str = "ElementMode"
    40  	case mCodeWithScope:
    41  		str = "CodeWithScopeMode"
    42  	case mSpacer:
    43  		str = "CodeWithScopeSpacerFrame"
    44  	default:
    45  		str = "UnknownMode"
    46  	}
    47  
    48  	return str
    49  }
    50  
    51  func (m mode) TypeString() string {
    52  	var str string
    53  
    54  	switch m {
    55  	case mTopLevel:
    56  		str = "TopLevel"
    57  	case mDocument:
    58  		str = "Document"
    59  	case mArray:
    60  		str = "Array"
    61  	case mValue:
    62  		str = "Value"
    63  	case mElement:
    64  		str = "Element"
    65  	case mCodeWithScope:
    66  		str = "CodeWithScope"
    67  	case mSpacer:
    68  		str = "CodeWithScopeSpacer"
    69  	default:
    70  		str = "Unknown"
    71  	}
    72  
    73  	return str
    74  }
    75  
    76  // TransitionError is an error returned when an invalid progressing a
    77  // ValueReader or ValueWriter state machine occurs.
    78  // If read is false, the error is for writing
    79  type TransitionError struct {
    80  	name        string
    81  	parent      mode
    82  	current     mode
    83  	destination mode
    84  	modes       []mode
    85  	action      string
    86  }
    87  
    88  func (te TransitionError) Error() string {
    89  	errString := fmt.Sprintf("%s can only %s", te.name, te.action)
    90  	if te.destination != mode(0) {
    91  		errString = fmt.Sprintf("%s a %s", errString, te.destination.TypeString())
    92  	}
    93  	errString = fmt.Sprintf("%s while positioned on a", errString)
    94  	for ind, m := range te.modes {
    95  		if ind != 0 && len(te.modes) > 2 {
    96  			errString = fmt.Sprintf("%s,", errString)
    97  		}
    98  		if ind == len(te.modes)-1 && len(te.modes) > 1 {
    99  			errString = fmt.Sprintf("%s or", errString)
   100  		}
   101  		errString = fmt.Sprintf("%s %s", errString, m.TypeString())
   102  	}
   103  	errString = fmt.Sprintf("%s but is positioned on a %s", errString, te.current.TypeString())
   104  	if te.parent != mode(0) {
   105  		errString = fmt.Sprintf("%s with parent %s", errString, te.parent.TypeString())
   106  	}
   107  	return errString
   108  }