func match(srcType reflect.Type, params params) Matcher {
	switch kind := srcType.Kind(); kind {
	case reflect.Ptr:
		return match(srcType.Elem(), params)
	case reflect.Slice, reflect.Array:
		return EachLike(match(srcType.Elem(), getDefaults()), params.slice.min)
	case reflect.Struct:
		result := StructMatcher{}

		for i := 0; i < srcType.NumField(); i++ {
			field := srcType.Field(i)
			result[field.Tag.Get("json")] = match(field.Type, pluckParams(field.Type, field.Tag.Get("pact")))
		}
		return result
	case reflect.String:
		if params.str.regEx != "" {
			return Term(params.str.example, params.str.regEx)
		}
		if params.str.example != "" {
			return Like(params.str.example)
		}

		return Like("string")
	case reflect.Bool:
		return Like(true)
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
		return Like(1)
	case reflect.Float32, reflect.Float64:
		return Like(1.1)
	default:
		panic(fmt.Sprintf("match: unhandled type: %v", srcType))
	}
}
func match(srcType reflect.Type, params params) Matcher {
	switch kind := srcType.Kind(); kind {
	case reflect.Ptr:
		return match(srcType.Elem(), params)
	case reflect.Slice, reflect.Array:
		return EachLike(match(srcType.Elem(), getDefaults()), params.slice.min)
	case reflect.Struct:
		result := StructMatcher{}

		for i := 0; i < srcType.NumField(); i++ {
			field := srcType.Field(i)
			result[field.Tag.Get("json")] = match(field.Type, pluckParams(field.Type, field.Tag.Get("pact")))
		}
		return result
	case reflect.String:
		if params.str.regEx != "" {
			return Term(params.str.example, params.str.regEx)
		}
		if params.str.example != "" {
			return Like(params.str.example)
		}

		return Like("string")
	case reflect.Bool:
		return Like(true)
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
		return Like(1)
	case reflect.Float32, reflect.Float64:
		return Like(1.1)
	default:
		panic(fmt.Sprintf("match: unhandled type: %v", srcType))
	}
}
func match ( srcType reflect . Type , params params ) Matcher { switch kind := srcType . Kind ( ) ; kind { case reflect . Ptr : return match ( srcType . Elem ( ) , params ) case reflect . Slice , reflect . Array : return EachLike ( match ( srcType . Elem ( ) , getDefaults ( ) ) , params . slice . min ) case reflect . Struct : result := StructMatcher { } for i := 0 ; i < srcType . NumField ( ) ; i ++ { field := srcType . Field ( i ) result [ field . Tag . Get ( " " ) ] = match ( field . Type , pluckParams ( field . Type , field . Tag . Get ( " " ) ) ) } return result case reflect . String : if params . str . regEx != " " { return Term ( params . str . example , params . str . regEx ) } if params . str . example != " " { return Like ( params . str . example ) } return Like ( " " ) case reflect . Bool : return Like ( true ) case reflect . Int , reflect . Int8 , reflect . Int16 , reflect . Int32 , reflect . Int64 , reflect . Uint , reflect . Uint8 , reflect . Uint16 , reflect . Uint32 , reflect . Uint64 : return Like ( 1 ) case reflect . Float32 , reflect . Float64 : return Like ( 1.1 ) default : panic ( fmt . Sprintf ( " " , srcType ) ) } }
// match recursively traverses the provided type and outputs a
// matcher string for it that is compatible with the Pact dsl.
match recursively traverses the provided type and outputs a matcher string for it that is compatible with the Pact dsl .