| 
									
										
										
										
											2019-08-29 01:32:25 +03:00
										 |  |  | // Copyright © 2018 Inanc Gumus | 
					
						
							|  |  |  | // Learn Go Programming Course | 
					
						
							|  |  |  | // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2019-10-30 19:34:44 +03:00
										 |  |  | // For more tutorials  : https://learngoprogramming.com | 
					
						
							|  |  |  | // In-person training  : https://www.linkedin.com/in/inancgumus/ | 
					
						
							|  |  |  | // Follow me on twitter: https://twitter.com/inancgumus | 
					
						
							| 
									
										
										
										
											2019-08-29 01:32:25 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | package pipe | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"reflect" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Record stores the log line fields. | 
					
						
							|  |  |  | // The underlying fields are kept hidden. | 
					
						
							|  |  |  | // The users of the package are decoupled from the underlying record fields. | 
					
						
							|  |  |  | // When the fields change, the client won't feel the difference (at least in compile-time). | 
					
						
							|  |  |  | type Record struct { | 
					
						
							|  |  |  | 	record | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-29 18:27:31 +03:00
										 |  |  | // Str returns a string field. Panics when the field doesn't exist. | 
					
						
							|  |  |  | func (r Record) Str(field string) string { | 
					
						
							| 
									
										
										
										
											2019-08-29 01:32:25 +03:00
										 |  |  | 	return r.mustGet(field, reflect.String).String() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Int returns an int field. Panics when the field doesn't exist. | 
					
						
							|  |  |  | func (r Record) Int(field string) int { | 
					
						
							|  |  |  | 	return int(r.mustGet(field, reflect.Int).Int()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Fields returns all the field names. | 
					
						
							|  |  |  | // The names can be used to query the Record. | 
					
						
							|  |  |  | func (r Record) Fields() (fields []string) { | 
					
						
							|  |  |  | 	t := reflect.TypeOf(record{}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i := 0; i < t.NumField(); i++ { | 
					
						
							|  |  |  | 		f := t.Field(i) | 
					
						
							|  |  |  | 		s := fmt.Sprintf("(%s: %s)", f.Name, f.Type.Name()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		fields = append(fields, s) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // mustGet the field with the same kind or panics. | 
					
						
							|  |  |  | func (r Record) mustGet(field string, kind reflect.Kind) reflect.Value { | 
					
						
							|  |  |  | 	v := reflect.ValueOf(r.record).FieldByName(field) | 
					
						
							|  |  |  | 	if !v.IsValid() { | 
					
						
							|  |  |  | 		panic(fmt.Errorf("record.%s does not exist", field)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if v.Kind() != kind { | 
					
						
							|  |  |  | 		panic(fmt.Errorf("record.%s is not %q", field, kind)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return v | 
					
						
							|  |  |  | } |