github.com/google/go-github/v74@v74.0.0/github/rules.go (about) 1 // Copyright 2025 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "encoding/json" 10 "reflect" 11 ) 12 13 // RulesetTarget represents a GitHub ruleset target. 14 type RulesetTarget string 15 16 // This is the set of GitHub ruleset targets. 17 const ( 18 RulesetTargetBranch RulesetTarget = "branch" 19 RulesetTargetTag RulesetTarget = "tag" 20 RulesetTargetPush RulesetTarget = "push" 21 ) 22 23 // RulesetSourceType represents a GitHub ruleset source type. 24 type RulesetSourceType string 25 26 // This is the set of GitHub ruleset source types. 27 const ( 28 RulesetSourceTypeRepository RulesetSourceType = "Repository" 29 RulesetSourceTypeOrganization RulesetSourceType = "Organization" 30 RulesetSourceTypeEnterprise RulesetSourceType = "Enterprise" 31 ) 32 33 // RulesetEnforcement represents a GitHub ruleset enforcement. 34 type RulesetEnforcement string 35 36 // This is the set of GitHub ruleset enforcements. 37 const ( 38 RulesetEnforcementDisabled RulesetEnforcement = "disabled" 39 RulesetEnforcementActive RulesetEnforcement = "active" 40 RulesetEnforcementEvaluate RulesetEnforcement = "evaluate" 41 ) 42 43 // BypassActorType represents a GitHub ruleset bypass actor type. 44 type BypassActorType string 45 46 // This is the set of GitHub ruleset bypass actor types. 47 const ( 48 BypassActorTypeIntegration BypassActorType = "Integration" 49 BypassActorTypeOrganizationAdmin BypassActorType = "OrganizationAdmin" 50 BypassActorTypeRepositoryRole BypassActorType = "RepositoryRole" 51 BypassActorTypeTeam BypassActorType = "Team" 52 BypassActorTypeDeployKey BypassActorType = "DeployKey" 53 ) 54 55 // BypassMode represents a GitHub ruleset bypass mode. 56 type BypassMode string 57 58 // This is the set of GitHub ruleset bypass modes. 59 const ( 60 BypassModeAlways BypassMode = "always" 61 BypassModePullRequest BypassMode = "pull_request" 62 BypassModeNever BypassMode = "never" 63 ) 64 65 // RepositoryRuleType represents a GitHub ruleset rule type. 66 type RepositoryRuleType string 67 68 // This is the set of GitHub ruleset rule types. 69 const ( 70 RulesetRuleTypeCreation RepositoryRuleType = "creation" 71 RulesetRuleTypeUpdate RepositoryRuleType = "update" 72 RulesetRuleTypeDeletion RepositoryRuleType = "deletion" 73 RulesetRuleTypeRequiredLinearHistory RepositoryRuleType = "required_linear_history" 74 RulesetRuleTypeMergeQueue RepositoryRuleType = "merge_queue" 75 RulesetRuleTypeRequiredDeployments RepositoryRuleType = "required_deployments" 76 RulesetRuleTypeRequiredSignatures RepositoryRuleType = "required_signatures" 77 RulesetRuleTypePullRequest RepositoryRuleType = "pull_request" 78 RulesetRuleTypeRequiredStatusChecks RepositoryRuleType = "required_status_checks" 79 RulesetRuleTypeNonFastForward RepositoryRuleType = "non_fast_forward" 80 RulesetRuleTypeCommitMessagePattern RepositoryRuleType = "commit_message_pattern" 81 RulesetRuleTypeCommitAuthorEmailPattern RepositoryRuleType = "commit_author_email_pattern" 82 RulesetRuleTypeCommitterEmailPattern RepositoryRuleType = "committer_email_pattern" 83 RulesetRuleTypeBranchNamePattern RepositoryRuleType = "branch_name_pattern" 84 RulesetRuleTypeTagNamePattern RepositoryRuleType = "tag_name_pattern" 85 RulesetRuleTypeFilePathRestriction RepositoryRuleType = "file_path_restriction" 86 RulesetRuleTypeMaxFilePathLength RepositoryRuleType = "max_file_path_length" 87 RulesetRuleTypeFileExtensionRestriction RepositoryRuleType = "file_extension_restriction" 88 RulesetRuleTypeMaxFileSize RepositoryRuleType = "max_file_size" 89 RulesetRuleTypeWorkflows RepositoryRuleType = "workflows" 90 RulesetRuleTypeCodeScanning RepositoryRuleType = "code_scanning" 91 ) 92 93 // MergeGroupingStrategy models a GitHub merge grouping strategy. 94 type MergeGroupingStrategy string 95 96 // This is the set of GitHub merge grouping strategies. 97 const ( 98 MergeGroupingStrategyAllGreen MergeGroupingStrategy = "ALLGREEN" 99 MergeGroupingStrategyHeadGreen MergeGroupingStrategy = "HEADGREEN" 100 ) 101 102 // PullRequestMergeMethod is used in PullRequestRuleParameters, 103 // where the GitHub API expects lowercase merge method values: "merge", "rebase", "squash". 104 // 105 // NOTE: GitHub's API inconsistently uses different casing for the same logical values 106 // across different rules. 107 // 108 // TODO: Unify with MergeQueueMergeMethod once the GitHub API uses consistent casing. 109 type PullRequestMergeMethod string 110 111 const ( 112 PullRequestMergeMethodMerge PullRequestMergeMethod = "merge" 113 PullRequestMergeMethodRebase PullRequestMergeMethod = "rebase" 114 PullRequestMergeMethodSquash PullRequestMergeMethod = "squash" 115 ) 116 117 // MergeQueueMergeMethod is used in MergeQueueRuleParameters, 118 // where the GitHub API expects uppercase merge method values: "MERGE", "REBASE", "SQUASH". 119 // 120 // NOTE: This type exists alongside PullRequestMergeMethod solely due to API casing inconsistencies. 121 // It enforces the correct usage by API context. 122 // 123 // TODO: Unify with PullRequestMergeMethod once the GitHub API uses consistent casing. 124 type MergeQueueMergeMethod string 125 126 const ( 127 MergeQueueMergeMethodMerge MergeQueueMergeMethod = "MERGE" 128 MergeQueueMergeMethodRebase MergeQueueMergeMethod = "REBASE" 129 MergeQueueMergeMethodSquash MergeQueueMergeMethod = "SQUASH" 130 ) 131 132 // PatternRuleOperator models a GitHub pattern rule operator. 133 type PatternRuleOperator string 134 135 // This is the set of GitHub pattern rule operators. 136 const ( 137 PatternRuleOperatorStartsWith PatternRuleOperator = "starts_with" 138 PatternRuleOperatorEndsWith PatternRuleOperator = "ends_with" 139 PatternRuleOperatorContains PatternRuleOperator = "contains" 140 PatternRuleOperatorRegex PatternRuleOperator = "regex" 141 ) 142 143 // CodeScanningAlertsThreshold models a GitHub code scanning alerts threshold. 144 type CodeScanningAlertsThreshold string 145 146 // This is the set of GitHub code scanning alerts thresholds. 147 const ( 148 CodeScanningAlertsThresholdNone CodeScanningAlertsThreshold = "none" 149 CodeScanningAlertsThresholdErrors CodeScanningAlertsThreshold = "errors" 150 CodeScanningAlertsThresholdErrorsAndWarnings CodeScanningAlertsThreshold = "errors_and_warnings" 151 CodeScanningAlertsThresholdAll CodeScanningAlertsThreshold = "all" 152 ) 153 154 // CodeScanningSecurityAlertsThreshold models a GitHub code scanning security alerts threshold. 155 type CodeScanningSecurityAlertsThreshold string 156 157 // This is the set of GitHub code scanning security alerts thresholds. 158 const ( 159 CodeScanningSecurityAlertsThresholdNone CodeScanningSecurityAlertsThreshold = "none" 160 CodeScanningSecurityAlertsThresholdCritical CodeScanningSecurityAlertsThreshold = "critical" 161 CodeScanningSecurityAlertsThresholdHighOrHigher CodeScanningSecurityAlertsThreshold = "high_or_higher" 162 CodeScanningSecurityAlertsThresholdMediumOrHigher CodeScanningSecurityAlertsThreshold = "medium_or_higher" 163 CodeScanningSecurityAlertsThresholdAll CodeScanningSecurityAlertsThreshold = "all" 164 ) 165 166 // RepositoryRuleset represents a GitHub ruleset object. 167 type RepositoryRuleset struct { 168 ID *int64 `json:"id,omitempty"` 169 Name string `json:"name"` 170 Target *RulesetTarget `json:"target,omitempty"` 171 SourceType *RulesetSourceType `json:"source_type,omitempty"` 172 Source string `json:"source"` 173 Enforcement RulesetEnforcement `json:"enforcement"` 174 BypassActors []*BypassActor `json:"bypass_actors,omitempty"` 175 CurrentUserCanBypass *BypassMode `json:"current_user_can_bypass,omitempty"` 176 NodeID *string `json:"node_id,omitempty"` 177 Links *RepositoryRulesetLinks `json:"_links,omitempty"` 178 Conditions *RepositoryRulesetConditions `json:"conditions,omitempty"` 179 Rules *RepositoryRulesetRules `json:"rules,omitempty"` 180 UpdatedAt *Timestamp `json:"updated_at,omitempty"` 181 CreatedAt *Timestamp `json:"created_at,omitempty"` 182 } 183 184 // BypassActor represents the bypass actors from a ruleset. 185 type BypassActor struct { 186 ActorID *int64 `json:"actor_id,omitempty"` 187 ActorType *BypassActorType `json:"actor_type,omitempty"` 188 BypassMode *BypassMode `json:"bypass_mode,omitempty"` 189 } 190 191 // RepositoryRulesetLinks represents the "_links" object in a Ruleset. 192 type RepositoryRulesetLinks struct { 193 Self *RepositoryRulesetLink `json:"self,omitempty"` 194 HTML *RepositoryRulesetLink `json:"html,omitempty"` 195 } 196 197 // RepositoryRulesetLink represents a single link object from GitHub ruleset request _links. 198 type RepositoryRulesetLink struct { 199 HRef *string `json:"href,omitempty"` 200 } 201 202 // RepositoryRulesetConditions represents the conditions object in a ruleset. 203 // Set either RepositoryName or RepositoryID or RepositoryProperty, not more than one. 204 type RepositoryRulesetConditions struct { 205 RefName *RepositoryRulesetRefConditionParameters `json:"ref_name,omitempty"` 206 RepositoryID *RepositoryRulesetRepositoryIDsConditionParameters `json:"repository_id,omitempty"` 207 RepositoryName *RepositoryRulesetRepositoryNamesConditionParameters `json:"repository_name,omitempty"` 208 RepositoryProperty *RepositoryRulesetRepositoryPropertyConditionParameters `json:"repository_property,omitempty"` 209 OrganizationID *RepositoryRulesetOrganizationIDsConditionParameters `json:"organization_id,omitempty"` 210 OrganizationName *RepositoryRulesetOrganizationNamesConditionParameters `json:"organization_name,omitempty"` 211 } 212 213 // RepositoryRulesetRefConditionParameters represents the conditions object for ref_names. 214 type RepositoryRulesetRefConditionParameters struct { 215 Include []string `json:"include"` 216 Exclude []string `json:"exclude"` 217 } 218 219 // RepositoryRulesetRepositoryIDsConditionParameters represents the conditions object for repository_id. 220 type RepositoryRulesetRepositoryIDsConditionParameters struct { 221 RepositoryIDs []int64 `json:"repository_ids,omitempty"` 222 } 223 224 // RepositoryRulesetRepositoryNamesConditionParameters represents the conditions object for repository_name. 225 type RepositoryRulesetRepositoryNamesConditionParameters struct { 226 Include []string `json:"include"` 227 Exclude []string `json:"exclude"` 228 Protected *bool `json:"protected,omitempty"` 229 } 230 231 // RepositoryRulesetRepositoryPropertyConditionParameters represents the conditions object for repository_property. 232 type RepositoryRulesetRepositoryPropertyConditionParameters struct { 233 Include []*RepositoryRulesetRepositoryPropertyTargetParameters `json:"include"` 234 Exclude []*RepositoryRulesetRepositoryPropertyTargetParameters `json:"exclude"` 235 } 236 237 // RepositoryRulesetRepositoryPropertyTargetParameters represents a repository_property name and values to be used for targeting. 238 type RepositoryRulesetRepositoryPropertyTargetParameters struct { 239 Name string `json:"name"` 240 PropertyValues []string `json:"property_values"` 241 Source *string `json:"source,omitempty"` 242 } 243 244 // RepositoryRulesetOrganizationIDsConditionParameters represents the conditions object for organization_id. 245 type RepositoryRulesetOrganizationIDsConditionParameters struct { 246 OrganizationIDs []int64 `json:"organization_ids,omitempty"` 247 } 248 249 // RepositoryRulesetOrganizationNamesConditionParameters represents the conditions object for organization_name. 250 type RepositoryRulesetOrganizationNamesConditionParameters struct { 251 Include []string `json:"include"` 252 Exclude []string `json:"exclude"` 253 } 254 255 // RepositoryRule represents a GitHub ruleset rule object. 256 type RepositoryRule struct { 257 Type RepositoryRuleType `json:"type"` 258 Parameters any `json:"parameters,omitempty"` 259 } 260 261 // RepositoryRulesetRules represents a GitHub ruleset rules object. 262 // This type doesn't have JSON annotations as it uses custom marshaling. 263 type RepositoryRulesetRules struct { 264 Creation *EmptyRuleParameters 265 Update *UpdateRuleParameters 266 Deletion *EmptyRuleParameters 267 RequiredLinearHistory *EmptyRuleParameters 268 MergeQueue *MergeQueueRuleParameters 269 RequiredDeployments *RequiredDeploymentsRuleParameters 270 RequiredSignatures *EmptyRuleParameters 271 PullRequest *PullRequestRuleParameters 272 RequiredStatusChecks *RequiredStatusChecksRuleParameters 273 NonFastForward *EmptyRuleParameters 274 CommitMessagePattern *PatternRuleParameters 275 CommitAuthorEmailPattern *PatternRuleParameters 276 CommitterEmailPattern *PatternRuleParameters 277 BranchNamePattern *PatternRuleParameters 278 TagNamePattern *PatternRuleParameters 279 FilePathRestriction *FilePathRestrictionRuleParameters 280 MaxFilePathLength *MaxFilePathLengthRuleParameters 281 FileExtensionRestriction *FileExtensionRestrictionRuleParameters 282 MaxFileSize *MaxFileSizeRuleParameters 283 Workflows *WorkflowsRuleParameters 284 CodeScanning *CodeScanningRuleParameters 285 } 286 287 // BranchRules represents the rules active for a GitHub repository branch. 288 // This type doesn't have JSON annotations as it uses custom marshaling. 289 type BranchRules struct { 290 Creation []*BranchRuleMetadata 291 Update []*UpdateBranchRule 292 Deletion []*BranchRuleMetadata 293 RequiredLinearHistory []*BranchRuleMetadata 294 MergeQueue []*MergeQueueBranchRule 295 RequiredDeployments []*RequiredDeploymentsBranchRule 296 RequiredSignatures []*BranchRuleMetadata 297 PullRequest []*PullRequestBranchRule 298 RequiredStatusChecks []*RequiredStatusChecksBranchRule 299 NonFastForward []*BranchRuleMetadata 300 CommitMessagePattern []*PatternBranchRule 301 CommitAuthorEmailPattern []*PatternBranchRule 302 CommitterEmailPattern []*PatternBranchRule 303 BranchNamePattern []*PatternBranchRule 304 TagNamePattern []*PatternBranchRule 305 FilePathRestriction []*FilePathRestrictionBranchRule 306 MaxFilePathLength []*MaxFilePathLengthBranchRule 307 FileExtensionRestriction []*FileExtensionRestrictionBranchRule 308 MaxFileSize []*MaxFileSizeBranchRule 309 Workflows []*WorkflowsBranchRule 310 CodeScanning []*CodeScanningBranchRule 311 } 312 313 // BranchRuleMetadata represents the metadata for a branch rule. 314 type BranchRuleMetadata struct { 315 RulesetSourceType RulesetSourceType `json:"ruleset_source_type"` 316 RulesetSource string `json:"ruleset_source"` 317 RulesetID int64 `json:"ruleset_id"` 318 } 319 320 // UpdateBranchRule represents an update branch rule. 321 type UpdateBranchRule struct { 322 BranchRuleMetadata 323 Parameters UpdateRuleParameters `json:"parameters"` 324 } 325 326 // MergeQueueBranchRule represents a merge queue branch rule. 327 type MergeQueueBranchRule struct { 328 BranchRuleMetadata 329 Parameters MergeQueueRuleParameters `json:"parameters"` 330 } 331 332 // RequiredDeploymentsBranchRule represents a required deployments branch rule. 333 type RequiredDeploymentsBranchRule struct { 334 BranchRuleMetadata 335 Parameters RequiredDeploymentsRuleParameters `json:"parameters"` 336 } 337 338 // PullRequestBranchRule represents a pull request branch rule. 339 type PullRequestBranchRule struct { 340 BranchRuleMetadata 341 Parameters PullRequestRuleParameters `json:"parameters"` 342 } 343 344 // RequiredStatusChecksBranchRule represents a required status checks branch rule. 345 type RequiredStatusChecksBranchRule struct { 346 BranchRuleMetadata 347 Parameters RequiredStatusChecksRuleParameters `json:"parameters"` 348 } 349 350 // PatternBranchRule represents a pattern branch rule. 351 type PatternBranchRule struct { 352 BranchRuleMetadata 353 Parameters PatternRuleParameters `json:"parameters"` 354 } 355 356 // FilePathRestrictionBranchRule represents a file path restriction branch rule. 357 type FilePathRestrictionBranchRule struct { 358 BranchRuleMetadata 359 Parameters FilePathRestrictionRuleParameters `json:"parameters"` 360 } 361 362 // MaxFilePathLengthBranchRule represents a max file path length branch rule. 363 type MaxFilePathLengthBranchRule struct { 364 BranchRuleMetadata 365 Parameters MaxFilePathLengthRuleParameters `json:"parameters"` 366 } 367 368 // FileExtensionRestrictionBranchRule represents a file extension restriction branch rule. 369 type FileExtensionRestrictionBranchRule struct { 370 BranchRuleMetadata 371 Parameters FileExtensionRestrictionRuleParameters `json:"parameters"` 372 } 373 374 // MaxFileSizeBranchRule represents a max file size branch rule. 375 type MaxFileSizeBranchRule struct { 376 BranchRuleMetadata 377 Parameters MaxFileSizeRuleParameters `json:"parameters"` 378 } 379 380 // WorkflowsBranchRule represents a workflows branch rule. 381 type WorkflowsBranchRule struct { 382 BranchRuleMetadata 383 Parameters WorkflowsRuleParameters `json:"parameters"` 384 } 385 386 // CodeScanningBranchRule represents a code scanning branch rule. 387 type CodeScanningBranchRule struct { 388 BranchRuleMetadata 389 Parameters CodeScanningRuleParameters `json:"parameters"` 390 } 391 392 // EmptyRuleParameters represents the parameters for a rule with no options. 393 type EmptyRuleParameters struct{} 394 395 // UpdateRuleParameters represents the update rule parameters. 396 type UpdateRuleParameters struct { 397 UpdateAllowsFetchAndMerge bool `json:"update_allows_fetch_and_merge,omitempty"` 398 } 399 400 // MergeQueueRuleParameters represents the merge_queue rule parameters. 401 type MergeQueueRuleParameters struct { 402 CheckResponseTimeoutMinutes int `json:"check_response_timeout_minutes"` 403 GroupingStrategy MergeGroupingStrategy `json:"grouping_strategy"` 404 MaxEntriesToBuild int `json:"max_entries_to_build"` 405 MaxEntriesToMerge int `json:"max_entries_to_merge"` 406 MergeMethod MergeQueueMergeMethod `json:"merge_method"` 407 MinEntriesToMerge int `json:"min_entries_to_merge"` 408 MinEntriesToMergeWaitMinutes int `json:"min_entries_to_merge_wait_minutes"` 409 } 410 411 // RequiredDeploymentsRuleParameters represents the required deployments rule parameters. 412 type RequiredDeploymentsRuleParameters struct { 413 RequiredDeploymentEnvironments []string `json:"required_deployment_environments"` 414 } 415 416 // PullRequestRuleParameters represents the pull_request rule parameters. 417 type PullRequestRuleParameters struct { 418 AllowedMergeMethods []PullRequestMergeMethod `json:"allowed_merge_methods"` 419 AutomaticCopilotCodeReviewEnabled *bool `json:"automatic_copilot_code_review_enabled,omitempty"` 420 DismissStaleReviewsOnPush bool `json:"dismiss_stale_reviews_on_push"` 421 RequireCodeOwnerReview bool `json:"require_code_owner_review"` 422 RequireLastPushApproval bool `json:"require_last_push_approval"` 423 RequiredApprovingReviewCount int `json:"required_approving_review_count"` 424 RequiredReviewThreadResolution bool `json:"required_review_thread_resolution"` 425 } 426 427 // RequiredStatusChecksRuleParameters represents the required status checks rule parameters. 428 type RequiredStatusChecksRuleParameters struct { 429 DoNotEnforceOnCreate *bool `json:"do_not_enforce_on_create,omitempty"` 430 RequiredStatusChecks []*RuleStatusCheck `json:"required_status_checks"` 431 StrictRequiredStatusChecksPolicy bool `json:"strict_required_status_checks_policy"` 432 } 433 434 // RuleStatusCheck represents a status checks for the required status checks rule parameters. 435 type RuleStatusCheck struct { 436 Context string `json:"context"` 437 IntegrationID *int64 `json:"integration_id,omitempty"` 438 } 439 440 // PatternRuleParameters represents the parameters for a pattern rule. 441 type PatternRuleParameters struct { 442 Name *string `json:"name,omitempty"` 443 // If Negate is true, the rule will fail if the pattern matches. 444 Negate *bool `json:"negate,omitempty"` 445 Operator PatternRuleOperator `json:"operator"` 446 Pattern string `json:"pattern"` 447 } 448 449 // FilePathRestrictionRuleParameters represents the file path restriction rule parameters. 450 type FilePathRestrictionRuleParameters struct { 451 RestrictedFilePaths []string `json:"restricted_file_paths"` 452 } 453 454 // MaxFilePathLengthRuleParameters represents the max file path length rule parameters. 455 type MaxFilePathLengthRuleParameters struct { 456 MaxFilePathLength int `json:"max_file_path_length"` 457 } 458 459 // FileExtensionRestrictionRuleParameters represents the file extension restriction rule parameters. 460 type FileExtensionRestrictionRuleParameters struct { 461 RestrictedFileExtensions []string `json:"restricted_file_extensions"` 462 } 463 464 // MaxFileSizeRuleParameters represents the max file size rule parameters. 465 type MaxFileSizeRuleParameters struct { 466 MaxFileSize int64 `json:"max_file_size"` 467 } 468 469 // WorkflowsRuleParameters represents the workflows rule parameters. 470 type WorkflowsRuleParameters struct { 471 DoNotEnforceOnCreate *bool `json:"do_not_enforce_on_create,omitempty"` 472 Workflows []*RuleWorkflow `json:"workflows"` 473 } 474 475 // RuleWorkflow represents a Workflow for the workflows rule parameters. 476 type RuleWorkflow struct { 477 Path string `json:"path"` 478 Ref *string `json:"ref,omitempty"` 479 RepositoryID *int64 `json:"repository_id,omitempty"` 480 SHA *string `json:"sha,omitempty"` 481 } 482 483 // CodeScanningRuleParameters represents the code scanning rule parameters. 484 type CodeScanningRuleParameters struct { 485 CodeScanningTools []*RuleCodeScanningTool `json:"code_scanning_tools"` 486 } 487 488 // RuleCodeScanningTool represents a single code scanning tool for the code scanning parameters. 489 type RuleCodeScanningTool struct { 490 AlertsThreshold CodeScanningAlertsThreshold `json:"alerts_threshold"` 491 SecurityAlertsThreshold CodeScanningSecurityAlertsThreshold `json:"security_alerts_threshold"` 492 Tool string `json:"tool"` 493 } 494 495 // repositoryRulesetRuleWrapper is a helper type to marshal & unmarshal a ruleset rule. 496 type repositoryRulesetRuleWrapper struct { 497 Type RepositoryRuleType `json:"type"` 498 Parameters json.RawMessage `json:"parameters,omitempty"` 499 } 500 501 // MarshalJSON is a custom JSON marshaler for RulesetRules. 502 func (r *RepositoryRulesetRules) MarshalJSON() ([]byte, error) { 503 // The RepositoryRulesetRules type marshals to between 1 and 21 rules. 504 // If new rules are added to RepositoryRulesetRules the capacity below needs increasing 505 rawRules := make([]json.RawMessage, 0, 21) 506 507 if r.Creation != nil { 508 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCreation, r.Creation) 509 if err != nil { 510 return nil, err 511 } 512 rawRules = append(rawRules, json.RawMessage(bytes)) 513 } 514 515 if r.Update != nil { 516 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeUpdate, r.Update) 517 if err != nil { 518 return nil, err 519 } 520 rawRules = append(rawRules, json.RawMessage(bytes)) 521 } 522 523 if r.Deletion != nil { 524 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeDeletion, r.Deletion) 525 if err != nil { 526 return nil, err 527 } 528 rawRules = append(rawRules, json.RawMessage(bytes)) 529 } 530 531 if r.RequiredLinearHistory != nil { 532 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredLinearHistory, r.RequiredLinearHistory) 533 if err != nil { 534 return nil, err 535 } 536 rawRules = append(rawRules, json.RawMessage(bytes)) 537 } 538 539 if r.MergeQueue != nil { 540 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMergeQueue, r.MergeQueue) 541 if err != nil { 542 return nil, err 543 } 544 rawRules = append(rawRules, json.RawMessage(bytes)) 545 } 546 547 if r.RequiredDeployments != nil { 548 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredDeployments, r.RequiredDeployments) 549 if err != nil { 550 return nil, err 551 } 552 rawRules = append(rawRules, json.RawMessage(bytes)) 553 } 554 555 if r.RequiredSignatures != nil { 556 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredSignatures, r.RequiredSignatures) 557 if err != nil { 558 return nil, err 559 } 560 rawRules = append(rawRules, json.RawMessage(bytes)) 561 } 562 563 if r.PullRequest != nil { 564 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypePullRequest, r.PullRequest) 565 if err != nil { 566 return nil, err 567 } 568 rawRules = append(rawRules, json.RawMessage(bytes)) 569 } 570 571 if r.RequiredStatusChecks != nil { 572 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredStatusChecks, r.RequiredStatusChecks) 573 if err != nil { 574 return nil, err 575 } 576 rawRules = append(rawRules, json.RawMessage(bytes)) 577 } 578 579 if r.NonFastForward != nil { 580 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeNonFastForward, r.NonFastForward) 581 if err != nil { 582 return nil, err 583 } 584 rawRules = append(rawRules, json.RawMessage(bytes)) 585 } 586 587 if r.CommitMessagePattern != nil { 588 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitMessagePattern, r.CommitMessagePattern) 589 if err != nil { 590 return nil, err 591 } 592 rawRules = append(rawRules, json.RawMessage(bytes)) 593 } 594 595 if r.CommitAuthorEmailPattern != nil { 596 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitAuthorEmailPattern, r.CommitAuthorEmailPattern) 597 if err != nil { 598 return nil, err 599 } 600 rawRules = append(rawRules, json.RawMessage(bytes)) 601 } 602 603 if r.CommitterEmailPattern != nil { 604 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitterEmailPattern, r.CommitterEmailPattern) 605 if err != nil { 606 return nil, err 607 } 608 rawRules = append(rawRules, json.RawMessage(bytes)) 609 } 610 611 if r.BranchNamePattern != nil { 612 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeBranchNamePattern, r.BranchNamePattern) 613 if err != nil { 614 return nil, err 615 } 616 rawRules = append(rawRules, json.RawMessage(bytes)) 617 } 618 619 if r.TagNamePattern != nil { 620 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeTagNamePattern, r.TagNamePattern) 621 if err != nil { 622 return nil, err 623 } 624 rawRules = append(rawRules, json.RawMessage(bytes)) 625 } 626 627 if r.FilePathRestriction != nil { 628 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFilePathRestriction, r.FilePathRestriction) 629 if err != nil { 630 return nil, err 631 } 632 rawRules = append(rawRules, json.RawMessage(bytes)) 633 } 634 635 if r.MaxFilePathLength != nil { 636 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFilePathLength, r.MaxFilePathLength) 637 if err != nil { 638 return nil, err 639 } 640 rawRules = append(rawRules, json.RawMessage(bytes)) 641 } 642 643 if r.FileExtensionRestriction != nil { 644 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFileExtensionRestriction, r.FileExtensionRestriction) 645 if err != nil { 646 return nil, err 647 } 648 rawRules = append(rawRules, json.RawMessage(bytes)) 649 } 650 651 if r.MaxFileSize != nil { 652 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFileSize, r.MaxFileSize) 653 if err != nil { 654 return nil, err 655 } 656 rawRules = append(rawRules, json.RawMessage(bytes)) 657 } 658 659 if r.Workflows != nil { 660 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeWorkflows, r.Workflows) 661 if err != nil { 662 return nil, err 663 } 664 rawRules = append(rawRules, json.RawMessage(bytes)) 665 } 666 667 if r.CodeScanning != nil { 668 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCodeScanning, r.CodeScanning) 669 if err != nil { 670 return nil, err 671 } 672 rawRules = append(rawRules, json.RawMessage(bytes)) 673 } 674 675 return json.Marshal(rawRules) 676 } 677 678 // marshalRepositoryRulesetRule is a helper function to marshal a ruleset rule. 679 // 680 // TODO: Benchmark the code that uses reflection. 681 // TODO: Use a generator here instead of reflection if there is a significant performance hit. 682 func marshalRepositoryRulesetRule[T any](t RepositoryRuleType, params T) ([]byte, error) { 683 paramsType := reflect.TypeFor[T]() 684 685 if paramsType.Kind() == reflect.Pointer && (reflect.ValueOf(params).IsNil() || reflect.ValueOf(params).Elem().IsZero()) { 686 return json.Marshal(repositoryRulesetRuleWrapper{Type: t}) 687 } 688 689 bytes, err := json.Marshal(params) 690 if err != nil { 691 return nil, err 692 } 693 694 return json.Marshal(repositoryRulesetRuleWrapper{Type: t, Parameters: json.RawMessage(bytes)}) 695 } 696 697 // UnmarshalJSON is a custom JSON unmarshaler for RulesetRules. 698 func (r *RepositoryRulesetRules) UnmarshalJSON(data []byte) error { 699 var wrappers []*repositoryRulesetRuleWrapper 700 701 if err := json.Unmarshal(data, &wrappers); err != nil { 702 return err 703 } 704 705 for _, w := range wrappers { 706 switch w.Type { 707 case RulesetRuleTypeCreation: 708 r.Creation = &EmptyRuleParameters{} 709 case RulesetRuleTypeUpdate: 710 r.Update = &UpdateRuleParameters{} 711 712 if w.Parameters != nil { 713 if err := json.Unmarshal(w.Parameters, r.Update); err != nil { 714 return err 715 } 716 } 717 case RulesetRuleTypeDeletion: 718 r.Deletion = &EmptyRuleParameters{} 719 case RulesetRuleTypeRequiredLinearHistory: 720 r.RequiredLinearHistory = &EmptyRuleParameters{} 721 case RulesetRuleTypeMergeQueue: 722 r.MergeQueue = &MergeQueueRuleParameters{} 723 724 if w.Parameters != nil { 725 if err := json.Unmarshal(w.Parameters, r.MergeQueue); err != nil { 726 return err 727 } 728 } 729 case RulesetRuleTypeRequiredDeployments: 730 r.RequiredDeployments = &RequiredDeploymentsRuleParameters{} 731 732 if w.Parameters != nil { 733 if err := json.Unmarshal(w.Parameters, r.RequiredDeployments); err != nil { 734 return err 735 } 736 } 737 case RulesetRuleTypeRequiredSignatures: 738 r.RequiredSignatures = &EmptyRuleParameters{} 739 case RulesetRuleTypePullRequest: 740 r.PullRequest = &PullRequestRuleParameters{} 741 742 if w.Parameters != nil { 743 if err := json.Unmarshal(w.Parameters, r.PullRequest); err != nil { 744 return err 745 } 746 } 747 case RulesetRuleTypeRequiredStatusChecks: 748 r.RequiredStatusChecks = &RequiredStatusChecksRuleParameters{} 749 750 if w.Parameters != nil { 751 if err := json.Unmarshal(w.Parameters, r.RequiredStatusChecks); err != nil { 752 return err 753 } 754 } 755 case RulesetRuleTypeNonFastForward: 756 r.NonFastForward = &EmptyRuleParameters{} 757 case RulesetRuleTypeCommitMessagePattern: 758 r.CommitMessagePattern = &PatternRuleParameters{} 759 760 if w.Parameters != nil { 761 if err := json.Unmarshal(w.Parameters, r.CommitMessagePattern); err != nil { 762 return err 763 } 764 } 765 case RulesetRuleTypeCommitAuthorEmailPattern: 766 r.CommitAuthorEmailPattern = &PatternRuleParameters{} 767 768 if w.Parameters != nil { 769 if err := json.Unmarshal(w.Parameters, r.CommitAuthorEmailPattern); err != nil { 770 return err 771 } 772 } 773 case RulesetRuleTypeCommitterEmailPattern: 774 r.CommitterEmailPattern = &PatternRuleParameters{} 775 776 if w.Parameters != nil { 777 if err := json.Unmarshal(w.Parameters, r.CommitterEmailPattern); err != nil { 778 return err 779 } 780 } 781 case RulesetRuleTypeBranchNamePattern: 782 r.BranchNamePattern = &PatternRuleParameters{} 783 784 if w.Parameters != nil { 785 if err := json.Unmarshal(w.Parameters, r.BranchNamePattern); err != nil { 786 return err 787 } 788 } 789 case RulesetRuleTypeTagNamePattern: 790 r.TagNamePattern = &PatternRuleParameters{} 791 792 if w.Parameters != nil { 793 if err := json.Unmarshal(w.Parameters, r.TagNamePattern); err != nil { 794 return err 795 } 796 } 797 case RulesetRuleTypeFilePathRestriction: 798 r.FilePathRestriction = &FilePathRestrictionRuleParameters{} 799 800 if w.Parameters != nil { 801 if err := json.Unmarshal(w.Parameters, r.FilePathRestriction); err != nil { 802 return err 803 } 804 } 805 case RulesetRuleTypeMaxFilePathLength: 806 r.MaxFilePathLength = &MaxFilePathLengthRuleParameters{} 807 808 if w.Parameters != nil { 809 if err := json.Unmarshal(w.Parameters, r.MaxFilePathLength); err != nil { 810 return err 811 } 812 } 813 case RulesetRuleTypeFileExtensionRestriction: 814 r.FileExtensionRestriction = &FileExtensionRestrictionRuleParameters{} 815 816 if w.Parameters != nil { 817 if err := json.Unmarshal(w.Parameters, r.FileExtensionRestriction); err != nil { 818 return err 819 } 820 } 821 case RulesetRuleTypeMaxFileSize: 822 r.MaxFileSize = &MaxFileSizeRuleParameters{} 823 824 if w.Parameters != nil { 825 if err := json.Unmarshal(w.Parameters, r.MaxFileSize); err != nil { 826 return err 827 } 828 } 829 case RulesetRuleTypeWorkflows: 830 r.Workflows = &WorkflowsRuleParameters{} 831 832 if w.Parameters != nil { 833 if err := json.Unmarshal(w.Parameters, r.Workflows); err != nil { 834 return err 835 } 836 } 837 case RulesetRuleTypeCodeScanning: 838 r.CodeScanning = &CodeScanningRuleParameters{} 839 840 if w.Parameters != nil { 841 if err := json.Unmarshal(w.Parameters, r.CodeScanning); err != nil { 842 return err 843 } 844 } 845 } 846 } 847 848 return nil 849 } 850 851 // branchRuleWrapper is a helper type to unmarshal a branch rule. 852 type branchRuleWrapper struct { 853 Type RepositoryRuleType `json:"type"` 854 BranchRuleMetadata 855 Parameters json.RawMessage `json:"parameters,omitempty"` 856 } 857 858 // UnmarshalJSON is a custom JSON unmarshaler for BranchRules. 859 func (r *BranchRules) UnmarshalJSON(data []byte) error { 860 var wrappers []*branchRuleWrapper 861 862 if err := json.Unmarshal(data, &wrappers); err != nil { 863 return err 864 } 865 866 for _, w := range wrappers { 867 switch w.Type { 868 case RulesetRuleTypeCreation: 869 r.Creation = append(r.Creation, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 870 case RulesetRuleTypeUpdate: 871 params := &UpdateRuleParameters{} 872 873 if w.Parameters != nil { 874 if err := json.Unmarshal(w.Parameters, params); err != nil { 875 return err 876 } 877 } 878 879 r.Update = append(r.Update, &UpdateBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 880 case RulesetRuleTypeDeletion: 881 r.Deletion = append(r.Deletion, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 882 case RulesetRuleTypeRequiredLinearHistory: 883 r.RequiredLinearHistory = append(r.RequiredLinearHistory, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 884 case RulesetRuleTypeMergeQueue: 885 params := &MergeQueueRuleParameters{} 886 887 if w.Parameters != nil { 888 if err := json.Unmarshal(w.Parameters, params); err != nil { 889 return err 890 } 891 } 892 893 r.MergeQueue = append(r.MergeQueue, &MergeQueueBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 894 case RulesetRuleTypeRequiredDeployments: 895 params := &RequiredDeploymentsRuleParameters{} 896 897 if w.Parameters != nil { 898 if err := json.Unmarshal(w.Parameters, params); err != nil { 899 return err 900 } 901 } 902 903 r.RequiredDeployments = append(r.RequiredDeployments, &RequiredDeploymentsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 904 case RulesetRuleTypeRequiredSignatures: 905 r.RequiredSignatures = append(r.RequiredSignatures, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 906 case RulesetRuleTypePullRequest: 907 params := &PullRequestRuleParameters{} 908 909 if w.Parameters != nil { 910 if err := json.Unmarshal(w.Parameters, params); err != nil { 911 return err 912 } 913 } 914 915 r.PullRequest = append(r.PullRequest, &PullRequestBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 916 case RulesetRuleTypeRequiredStatusChecks: 917 params := &RequiredStatusChecksRuleParameters{} 918 919 if w.Parameters != nil { 920 if err := json.Unmarshal(w.Parameters, params); err != nil { 921 return err 922 } 923 } 924 925 r.RequiredStatusChecks = append(r.RequiredStatusChecks, &RequiredStatusChecksBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 926 case RulesetRuleTypeNonFastForward: 927 r.NonFastForward = append(r.NonFastForward, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 928 case RulesetRuleTypeCommitMessagePattern: 929 params := &PatternRuleParameters{} 930 931 if w.Parameters != nil { 932 if err := json.Unmarshal(w.Parameters, params); err != nil { 933 return err 934 } 935 } 936 937 r.CommitMessagePattern = append(r.CommitMessagePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 938 case RulesetRuleTypeCommitAuthorEmailPattern: 939 params := &PatternRuleParameters{} 940 941 if w.Parameters != nil { 942 if err := json.Unmarshal(w.Parameters, params); err != nil { 943 return err 944 } 945 } 946 947 r.CommitAuthorEmailPattern = append(r.CommitAuthorEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 948 case RulesetRuleTypeCommitterEmailPattern: 949 params := &PatternRuleParameters{} 950 951 if w.Parameters != nil { 952 if err := json.Unmarshal(w.Parameters, params); err != nil { 953 return err 954 } 955 } 956 957 r.CommitterEmailPattern = append(r.CommitterEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 958 case RulesetRuleTypeBranchNamePattern: 959 params := &PatternRuleParameters{} 960 961 if w.Parameters != nil { 962 if err := json.Unmarshal(w.Parameters, params); err != nil { 963 return err 964 } 965 } 966 967 r.BranchNamePattern = append(r.BranchNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 968 case RulesetRuleTypeTagNamePattern: 969 params := &PatternRuleParameters{} 970 971 if w.Parameters != nil { 972 if err := json.Unmarshal(w.Parameters, params); err != nil { 973 return err 974 } 975 } 976 977 r.TagNamePattern = append(r.TagNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 978 case RulesetRuleTypeFilePathRestriction: 979 params := &FilePathRestrictionRuleParameters{} 980 981 if w.Parameters != nil { 982 if err := json.Unmarshal(w.Parameters, params); err != nil { 983 return err 984 } 985 } 986 987 r.FilePathRestriction = append(r.FilePathRestriction, &FilePathRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 988 case RulesetRuleTypeMaxFilePathLength: 989 params := &MaxFilePathLengthRuleParameters{} 990 991 if w.Parameters != nil { 992 if err := json.Unmarshal(w.Parameters, params); err != nil { 993 return err 994 } 995 } 996 997 r.MaxFilePathLength = append(r.MaxFilePathLength, &MaxFilePathLengthBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 998 case RulesetRuleTypeFileExtensionRestriction: 999 params := &FileExtensionRestrictionRuleParameters{} 1000 1001 if w.Parameters != nil { 1002 if err := json.Unmarshal(w.Parameters, params); err != nil { 1003 return err 1004 } 1005 } 1006 1007 r.FileExtensionRestriction = append(r.FileExtensionRestriction, &FileExtensionRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 1008 case RulesetRuleTypeMaxFileSize: 1009 params := &MaxFileSizeRuleParameters{} 1010 1011 if w.Parameters != nil { 1012 if err := json.Unmarshal(w.Parameters, params); err != nil { 1013 return err 1014 } 1015 } 1016 1017 r.MaxFileSize = append(r.MaxFileSize, &MaxFileSizeBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 1018 case RulesetRuleTypeWorkflows: 1019 params := &WorkflowsRuleParameters{} 1020 1021 if w.Parameters != nil { 1022 if err := json.Unmarshal(w.Parameters, params); err != nil { 1023 return err 1024 } 1025 } 1026 1027 r.Workflows = append(r.Workflows, &WorkflowsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 1028 case RulesetRuleTypeCodeScanning: 1029 params := &CodeScanningRuleParameters{} 1030 1031 if w.Parameters != nil { 1032 if err := json.Unmarshal(w.Parameters, params); err != nil { 1033 return err 1034 } 1035 } 1036 1037 r.CodeScanning = append(r.CodeScanning, &CodeScanningBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 1038 } 1039 } 1040 1041 return nil 1042 } 1043 1044 // UnmarshalJSON is a custom JSON unmarshaler for RulesetRule. 1045 func (r *RepositoryRule) UnmarshalJSON(data []byte) error { 1046 w := repositoryRulesetRuleWrapper{} 1047 1048 if err := json.Unmarshal(data, &w); err != nil { 1049 return err 1050 } 1051 1052 r.Type = w.Type 1053 1054 switch r.Type { 1055 case RulesetRuleTypeCreation: 1056 r.Parameters = nil 1057 case RulesetRuleTypeUpdate: 1058 p := &UpdateRuleParameters{} 1059 1060 if w.Parameters != nil { 1061 if err := json.Unmarshal(w.Parameters, p); err != nil { 1062 return err 1063 } 1064 } 1065 1066 r.Parameters = p 1067 case RulesetRuleTypeDeletion: 1068 r.Parameters = nil 1069 case RulesetRuleTypeRequiredLinearHistory: 1070 r.Parameters = nil 1071 case RulesetRuleTypeMergeQueue: 1072 p := &MergeQueueRuleParameters{} 1073 1074 if w.Parameters != nil { 1075 if err := json.Unmarshal(w.Parameters, p); err != nil { 1076 return err 1077 } 1078 } 1079 1080 r.Parameters = p 1081 case RulesetRuleTypeRequiredDeployments: 1082 p := &RequiredDeploymentsRuleParameters{} 1083 1084 if w.Parameters != nil { 1085 if err := json.Unmarshal(w.Parameters, p); err != nil { 1086 return err 1087 } 1088 } 1089 1090 r.Parameters = p 1091 case RulesetRuleTypeRequiredSignatures: 1092 r.Parameters = nil 1093 case RulesetRuleTypePullRequest: 1094 p := &PullRequestRuleParameters{} 1095 1096 if w.Parameters != nil { 1097 if err := json.Unmarshal(w.Parameters, p); err != nil { 1098 return err 1099 } 1100 } 1101 1102 r.Parameters = p 1103 case RulesetRuleTypeRequiredStatusChecks: 1104 p := &RequiredStatusChecksRuleParameters{} 1105 1106 if w.Parameters != nil { 1107 if err := json.Unmarshal(w.Parameters, p); err != nil { 1108 return err 1109 } 1110 } 1111 1112 r.Parameters = p 1113 case RulesetRuleTypeNonFastForward: 1114 r.Parameters = nil 1115 case RulesetRuleTypeCommitMessagePattern: 1116 p := &PatternRuleParameters{} 1117 1118 if w.Parameters != nil { 1119 if err := json.Unmarshal(w.Parameters, p); err != nil { 1120 return err 1121 } 1122 } 1123 1124 r.Parameters = p 1125 case RulesetRuleTypeCommitAuthorEmailPattern: 1126 p := &PatternRuleParameters{} 1127 1128 if w.Parameters != nil { 1129 if err := json.Unmarshal(w.Parameters, p); err != nil { 1130 return err 1131 } 1132 } 1133 1134 r.Parameters = p 1135 case RulesetRuleTypeCommitterEmailPattern: 1136 p := &PatternRuleParameters{} 1137 1138 if w.Parameters != nil { 1139 if err := json.Unmarshal(w.Parameters, p); err != nil { 1140 return err 1141 } 1142 } 1143 1144 r.Parameters = p 1145 case RulesetRuleTypeBranchNamePattern: 1146 p := &PatternRuleParameters{} 1147 1148 if w.Parameters != nil { 1149 if err := json.Unmarshal(w.Parameters, p); err != nil { 1150 return err 1151 } 1152 } 1153 1154 r.Parameters = p 1155 case RulesetRuleTypeTagNamePattern: 1156 p := &PatternRuleParameters{} 1157 1158 if w.Parameters != nil { 1159 if err := json.Unmarshal(w.Parameters, p); err != nil { 1160 return err 1161 } 1162 } 1163 1164 r.Parameters = p 1165 case RulesetRuleTypeFilePathRestriction: 1166 p := &FilePathRestrictionRuleParameters{} 1167 1168 if w.Parameters != nil { 1169 if err := json.Unmarshal(w.Parameters, p); err != nil { 1170 return err 1171 } 1172 } 1173 1174 r.Parameters = p 1175 case RulesetRuleTypeMaxFilePathLength: 1176 p := &MaxFilePathLengthRuleParameters{} 1177 1178 if w.Parameters != nil { 1179 if err := json.Unmarshal(w.Parameters, p); err != nil { 1180 return err 1181 } 1182 } 1183 1184 r.Parameters = p 1185 case RulesetRuleTypeFileExtensionRestriction: 1186 p := &FileExtensionRestrictionRuleParameters{} 1187 1188 if w.Parameters != nil { 1189 if err := json.Unmarshal(w.Parameters, p); err != nil { 1190 return err 1191 } 1192 } 1193 1194 r.Parameters = p 1195 case RulesetRuleTypeMaxFileSize: 1196 p := &MaxFileSizeRuleParameters{} 1197 1198 if w.Parameters != nil { 1199 if err := json.Unmarshal(w.Parameters, p); err != nil { 1200 return err 1201 } 1202 } 1203 1204 r.Parameters = p 1205 case RulesetRuleTypeWorkflows: 1206 p := &WorkflowsRuleParameters{} 1207 1208 if w.Parameters != nil { 1209 if err := json.Unmarshal(w.Parameters, p); err != nil { 1210 return err 1211 } 1212 } 1213 1214 r.Parameters = p 1215 case RulesetRuleTypeCodeScanning: 1216 p := &CodeScanningRuleParameters{} 1217 1218 if w.Parameters != nil { 1219 if err := json.Unmarshal(w.Parameters, p); err != nil { 1220 return err 1221 } 1222 } 1223 1224 r.Parameters = p 1225 } 1226 1227 return nil 1228 }