package log import ( "context" "strings" "github.com/v2fly/v2ray-core/v4/common/serial" ) type logKey int const ( accessMessageKey logKey = iota ) type AccessStatus string const ( AccessAccepted = AccessStatus("accepted") AccessRejected = AccessStatus("rejected") ) type AccessMessage struct { From interface{} To interface{} Status AccessStatus Reason interface{} Email string Detour string } func (m *AccessMessage) String() string { builder := strings.Builder{} builder.WriteString(serial.ToString(m.From)) builder.WriteByte(' ') builder.WriteString(string(m.Status)) builder.WriteByte(' ') builder.WriteString(serial.ToString(m.To)) if len(m.Detour) > 0 { builder.WriteString(" [") builder.WriteString(m.Detour) builder.WriteByte(']') } if reason := serial.ToString(m.Reason); len(reason) > 0 { builder.WriteString(" ") builder.WriteString(reason) } if len(m.Email) > 0 { builder.WriteString(" email: ") builder.WriteString(m.Email) } return builder.String() } func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context { return context.WithValue(ctx, accessMessageKey, accessMessage) } func AccessMessageFromContext(ctx context.Context) *AccessMessage { if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok { return accessMessage } return nil }