github.com/mitghi/x@v0.0.0-20191206171256-71e86edf750d/structs/structs.go (about)

     1  /* MIT License
     2  * 
     3  * Copyright (c) 2018 Mike Taghavi <mitghi[at]gmail.com>
     4  * 
     5  * Permission is hereby granted, free of charge, to any person obtaining a copy
     6  * of this software and associated documentation files (the "Software"), to deal
     7  * in the Software without restriction, including without limitation the rights
     8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     9  * copies of the Software, and to permit persons to whom the Software is
    10  * furnished to do so, subject to the following conditions:
    11  * The above copyright notice and this permission notice shall be included in all
    12  * copies or substantial portions of the Software.
    13  * 
    14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    20  * SOFTWARE.
    21  */
    22  
    23  package structs
    24  
    25  import (
    26  	"bytes"
    27  	"fmt"
    28  	"reflect"
    29  )
    30  
    31  // CompileStructInfo is a function that takes a
    32  // struct `s`, generates general info table and
    33  // returns it as `string`.
    34  func CompileStructInfo(s interface{}) string {
    35  	const (
    36  		_fmtheader = "[struct: %-16s%-14sfields=%-6.1dsize=%-6.2d  ]\n"
    37  		_fmtbody   = "[  %-22s offset=%-6.1v size=%-6.1d align=%-6d ]\n"
    38  	)
    39  	var (
    40  		stype reflect.Type = reflect.TypeOf(s)
    41  		nf    int          = stype.NumField()
    42  		field reflect.StructField
    43  		buff  bytes.Buffer
    44  	)
    45  	buff.WriteString(fmt.Sprintf(_fmtheader, stype.Name(), " ", nf, stype.Size()))
    46  	for i := 0; i < nf; i++ {
    47  		field = stype.Field(i)
    48  		buff.WriteString(
    49  			fmt.Sprintf(_fmtbody,
    50  				field.Name,
    51  				field.Offset,
    52  				field.Type.Size(),
    53  				field.Type.Align(),
    54  			))
    55  	}
    56  	return buff.String()
    57  }