(code uint32, name, messageFormat string, publicAttributes ...string)
| 133 | } |
| 134 | |
| 135 | func define(code uint32, name, messageFormat string, publicAttributes ...string) *Definition { |
| 136 | ns := namespace(3) |
| 137 | if code == 0 { |
| 138 | code = uint32(codes.Unknown) |
| 139 | } |
| 140 | |
| 141 | def := &Definition{ |
| 142 | namespace: ns, |
| 143 | name: name, |
| 144 | messageFormat: messageFormat, |
| 145 | messageFormatArguments: messageFormatArguments(messageFormat), |
| 146 | publicAttributes: publicAttributes, |
| 147 | code: code, |
| 148 | } |
| 149 | |
| 150 | fullName := def.FullName() |
| 151 | |
| 152 | parsedMessageFormat, err := formatter.Parse(messageFormat) |
| 153 | if err != nil { |
| 154 | panic(fmt.Errorf("could not parse message format `%s` for %s: %w", messageFormat, fullName, err)) |
| 155 | } |
| 156 | def.parsedMessageFormat = parsedMessageFormat |
| 157 | |
| 158 | // All message format arguments must be public: |
| 159 | nextArg: |
| 160 | for _, arg := range def.messageFormatArguments { |
| 161 | for _, attr := range def.publicAttributes { |
| 162 | if arg == attr { |
| 163 | continue nextArg |
| 164 | } |
| 165 | } |
| 166 | def.publicAttributes = append(def.publicAttributes, arg) |
| 167 | } |
| 168 | |
| 169 | def.setGRPCStatus() // store the (marshaled) gRPC status message. |
| 170 | |
| 171 | if registered := registerDefinition(def); registered != def { |
| 172 | return registered |
| 173 | } |
| 174 | |
| 175 | desc := i18n.Define(fmt.Sprintf("error:%s", fullName), def.messageFormat) |
| 176 | desc.SetSource(2) |
| 177 | |
| 178 | return def |
| 179 | } |
| 180 | |
| 181 | var ( |
| 182 | definitions = make(map[string]*Definition) |
no test coverage detected