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