github.com/google/go-github/v71@v71.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 // 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 AutomaticCopilotCodeReviewEnabled *bool `json:"automatic_copilot_code_review_enabled,omitempty"` 400 DismissStaleReviewsOnPush bool `json:"dismiss_stale_reviews_on_push"` 401 RequireCodeOwnerReview bool `json:"require_code_owner_review"` 402 RequireLastPushApproval bool `json:"require_last_push_approval"` 403 RequiredApprovingReviewCount int `json:"required_approving_review_count"` 404 RequiredReviewThreadResolution bool `json:"required_review_thread_resolution"` 405 } 406 407 // RequiredStatusChecksRuleParameters represents the required status checks rule parameters. 408 type RequiredStatusChecksRuleParameters struct { 409 DoNotEnforceOnCreate *bool `json:"do_not_enforce_on_create,omitempty"` 410 RequiredStatusChecks []*RuleStatusCheck `json:"required_status_checks"` 411 StrictRequiredStatusChecksPolicy bool `json:"strict_required_status_checks_policy"` 412 } 413 414 // RuleStatusCheck represents a status checks for the required status checks rule parameters. 415 type RuleStatusCheck struct { 416 Context string `json:"context"` 417 IntegrationID *int64 `json:"integration_id,omitempty"` 418 } 419 420 // PatternRuleParameters represents the parameters for a pattern rule. 421 type PatternRuleParameters struct { 422 Name *string `json:"name,omitempty"` 423 // If Negate is true, the rule will fail if the pattern matches. 424 Negate *bool `json:"negate,omitempty"` 425 Operator PatternRuleOperator `json:"operator"` 426 Pattern string `json:"pattern"` 427 } 428 429 // FilePathRestrictionRuleParameters represents the file path restriction rule parameters. 430 type FilePathRestrictionRuleParameters struct { 431 RestrictedFilePaths []string `json:"restricted_file_paths"` 432 } 433 434 // MaxFilePathLengthRuleParameters represents the max file path length rule parameters. 435 type MaxFilePathLengthRuleParameters struct { 436 MaxFilePathLength int `json:"max_file_path_length"` 437 } 438 439 // FileExtensionRestrictionRuleParameters represents the file extension restriction rule parameters. 440 type FileExtensionRestrictionRuleParameters struct { 441 RestrictedFileExtensions []string `json:"restricted_file_extensions"` 442 } 443 444 // MaxFileSizeRuleParameters represents the max file size rule parameters. 445 type MaxFileSizeRuleParameters struct { 446 MaxFileSize int64 `json:"max_file_size"` 447 } 448 449 // WorkflowsRuleParameters represents the workflows rule parameters. 450 type WorkflowsRuleParameters struct { 451 DoNotEnforceOnCreate *bool `json:"do_not_enforce_on_create,omitempty"` 452 Workflows []*RuleWorkflow `json:"workflows"` 453 } 454 455 // RuleWorkflow represents a Workflow for the workflows rule parameters. 456 type RuleWorkflow struct { 457 Path string `json:"path"` 458 Ref *string `json:"ref,omitempty"` 459 RepositoryID *int64 `json:"repository_id,omitempty"` 460 SHA *string `json:"sha,omitempty"` 461 } 462 463 // CodeScanningRuleParameters represents the code scanning rule parameters. 464 type CodeScanningRuleParameters struct { 465 CodeScanningTools []*RuleCodeScanningTool `json:"code_scanning_tools"` 466 } 467 468 // RuleCodeScanningTool represents a single code scanning tool for the code scanning parameters. 469 type RuleCodeScanningTool struct { 470 AlertsThreshold CodeScanningAlertsThreshold `json:"alerts_threshold"` 471 SecurityAlertsThreshold CodeScanningSecurityAlertsThreshold `json:"security_alerts_threshold"` 472 Tool string `json:"tool"` 473 } 474 475 // repositoryRulesetRuleWrapper is a helper type to marshal & unmarshal a ruleset rule. 476 type repositoryRulesetRuleWrapper struct { 477 Type RepositoryRuleType `json:"type"` 478 Parameters json.RawMessage `json:"parameters,omitempty"` 479 } 480 481 // MarshalJSON is a custom JSON marshaler for RulesetRules. 482 func (r *RepositoryRulesetRules) MarshalJSON() ([]byte, error) { 483 // The RepositoryRulesetRules type marshals to between 1 and 21 rules. 484 // If new rules are added to RepositoryRulesetRules the capacity below needs increasing 485 rawRules := make([]json.RawMessage, 0, 21) 486 487 if r.Creation != nil { 488 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCreation, r.Creation) 489 if err != nil { 490 return nil, err 491 } 492 rawRules = append(rawRules, json.RawMessage(bytes)) 493 } 494 495 if r.Update != nil { 496 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeUpdate, r.Update) 497 if err != nil { 498 return nil, err 499 } 500 rawRules = append(rawRules, json.RawMessage(bytes)) 501 } 502 503 if r.Deletion != nil { 504 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeDeletion, r.Deletion) 505 if err != nil { 506 return nil, err 507 } 508 rawRules = append(rawRules, json.RawMessage(bytes)) 509 } 510 511 if r.RequiredLinearHistory != nil { 512 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredLinearHistory, r.RequiredLinearHistory) 513 if err != nil { 514 return nil, err 515 } 516 rawRules = append(rawRules, json.RawMessage(bytes)) 517 } 518 519 if r.MergeQueue != nil { 520 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMergeQueue, r.MergeQueue) 521 if err != nil { 522 return nil, err 523 } 524 rawRules = append(rawRules, json.RawMessage(bytes)) 525 } 526 527 if r.RequiredDeployments != nil { 528 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredDeployments, r.RequiredDeployments) 529 if err != nil { 530 return nil, err 531 } 532 rawRules = append(rawRules, json.RawMessage(bytes)) 533 } 534 535 if r.RequiredSignatures != nil { 536 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredSignatures, r.RequiredSignatures) 537 if err != nil { 538 return nil, err 539 } 540 rawRules = append(rawRules, json.RawMessage(bytes)) 541 } 542 543 if r.PullRequest != nil { 544 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypePullRequest, r.PullRequest) 545 if err != nil { 546 return nil, err 547 } 548 rawRules = append(rawRules, json.RawMessage(bytes)) 549 } 550 551 if r.RequiredStatusChecks != nil { 552 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredStatusChecks, r.RequiredStatusChecks) 553 if err != nil { 554 return nil, err 555 } 556 rawRules = append(rawRules, json.RawMessage(bytes)) 557 } 558 559 if r.NonFastForward != nil { 560 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeNonFastForward, r.NonFastForward) 561 if err != nil { 562 return nil, err 563 } 564 rawRules = append(rawRules, json.RawMessage(bytes)) 565 } 566 567 if r.CommitMessagePattern != nil { 568 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitMessagePattern, r.CommitMessagePattern) 569 if err != nil { 570 return nil, err 571 } 572 rawRules = append(rawRules, json.RawMessage(bytes)) 573 } 574 575 if r.CommitAuthorEmailPattern != nil { 576 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitAuthorEmailPattern, r.CommitAuthorEmailPattern) 577 if err != nil { 578 return nil, err 579 } 580 rawRules = append(rawRules, json.RawMessage(bytes)) 581 } 582 583 if r.CommitterEmailPattern != nil { 584 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitterEmailPattern, r.CommitterEmailPattern) 585 if err != nil { 586 return nil, err 587 } 588 rawRules = append(rawRules, json.RawMessage(bytes)) 589 } 590 591 if r.BranchNamePattern != nil { 592 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeBranchNamePattern, r.BranchNamePattern) 593 if err != nil { 594 return nil, err 595 } 596 rawRules = append(rawRules, json.RawMessage(bytes)) 597 } 598 599 if r.TagNamePattern != nil { 600 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeTagNamePattern, r.TagNamePattern) 601 if err != nil { 602 return nil, err 603 } 604 rawRules = append(rawRules, json.RawMessage(bytes)) 605 } 606 607 if r.FilePathRestriction != nil { 608 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFilePathRestriction, r.FilePathRestriction) 609 if err != nil { 610 return nil, err 611 } 612 rawRules = append(rawRules, json.RawMessage(bytes)) 613 } 614 615 if r.MaxFilePathLength != nil { 616 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFilePathLength, r.MaxFilePathLength) 617 if err != nil { 618 return nil, err 619 } 620 rawRules = append(rawRules, json.RawMessage(bytes)) 621 } 622 623 if r.FileExtensionRestriction != nil { 624 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFileExtensionRestriction, r.FileExtensionRestriction) 625 if err != nil { 626 return nil, err 627 } 628 rawRules = append(rawRules, json.RawMessage(bytes)) 629 } 630 631 if r.MaxFileSize != nil { 632 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFileSize, r.MaxFileSize) 633 if err != nil { 634 return nil, err 635 } 636 rawRules = append(rawRules, json.RawMessage(bytes)) 637 } 638 639 if r.Workflows != nil { 640 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeWorkflows, r.Workflows) 641 if err != nil { 642 return nil, err 643 } 644 rawRules = append(rawRules, json.RawMessage(bytes)) 645 } 646 647 if r.CodeScanning != nil { 648 bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCodeScanning, r.CodeScanning) 649 if err != nil { 650 return nil, err 651 } 652 rawRules = append(rawRules, json.RawMessage(bytes)) 653 } 654 655 return json.Marshal(rawRules) 656 } 657 658 // marshalRepositoryRulesetRule is a helper function to marshal a ruleset rule. 659 // 660 // TODO: Benchmark the code that uses reflection. 661 // TODO: Use a generator here instead of reflection if there is a significant performance hit. 662 func marshalRepositoryRulesetRule[T any](t RepositoryRuleType, params T) ([]byte, error) { 663 paramsType := reflect.TypeFor[T]() 664 665 if paramsType.Kind() == reflect.Pointer && (reflect.ValueOf(params).IsNil() || reflect.ValueOf(params).Elem().IsZero()) { 666 return json.Marshal(repositoryRulesetRuleWrapper{Type: t}) 667 } 668 669 bytes, err := json.Marshal(params) 670 if err != nil { 671 return nil, err 672 } 673 674 return json.Marshal(repositoryRulesetRuleWrapper{Type: t, Parameters: json.RawMessage(bytes)}) 675 } 676 677 // UnmarshalJSON is a custom JSON unmarshaler for RulesetRules. 678 func (r *RepositoryRulesetRules) UnmarshalJSON(data []byte) error { 679 var wrappers []*repositoryRulesetRuleWrapper 680 681 if err := json.Unmarshal(data, &wrappers); err != nil { 682 return err 683 } 684 685 for _, w := range wrappers { 686 switch w.Type { 687 case RulesetRuleTypeCreation: 688 r.Creation = &EmptyRuleParameters{} 689 case RulesetRuleTypeUpdate: 690 r.Update = &UpdateRuleParameters{} 691 692 if w.Parameters != nil { 693 if err := json.Unmarshal(w.Parameters, r.Update); err != nil { 694 return err 695 } 696 } 697 case RulesetRuleTypeDeletion: 698 r.Deletion = &EmptyRuleParameters{} 699 case RulesetRuleTypeRequiredLinearHistory: 700 r.RequiredLinearHistory = &EmptyRuleParameters{} 701 case RulesetRuleTypeMergeQueue: 702 r.MergeQueue = &MergeQueueRuleParameters{} 703 704 if w.Parameters != nil { 705 if err := json.Unmarshal(w.Parameters, r.MergeQueue); err != nil { 706 return err 707 } 708 } 709 case RulesetRuleTypeRequiredDeployments: 710 r.RequiredDeployments = &RequiredDeploymentsRuleParameters{} 711 712 if w.Parameters != nil { 713 if err := json.Unmarshal(w.Parameters, r.RequiredDeployments); err != nil { 714 return err 715 } 716 } 717 case RulesetRuleTypeRequiredSignatures: 718 r.RequiredSignatures = &EmptyRuleParameters{} 719 case RulesetRuleTypePullRequest: 720 r.PullRequest = &PullRequestRuleParameters{} 721 722 if w.Parameters != nil { 723 if err := json.Unmarshal(w.Parameters, r.PullRequest); err != nil { 724 return err 725 } 726 } 727 case RulesetRuleTypeRequiredStatusChecks: 728 r.RequiredStatusChecks = &RequiredStatusChecksRuleParameters{} 729 730 if w.Parameters != nil { 731 if err := json.Unmarshal(w.Parameters, r.RequiredStatusChecks); err != nil { 732 return err 733 } 734 } 735 case RulesetRuleTypeNonFastForward: 736 r.NonFastForward = &EmptyRuleParameters{} 737 case RulesetRuleTypeCommitMessagePattern: 738 r.CommitMessagePattern = &PatternRuleParameters{} 739 740 if w.Parameters != nil { 741 if err := json.Unmarshal(w.Parameters, r.CommitMessagePattern); err != nil { 742 return err 743 } 744 } 745 case RulesetRuleTypeCommitAuthorEmailPattern: 746 r.CommitAuthorEmailPattern = &PatternRuleParameters{} 747 748 if w.Parameters != nil { 749 if err := json.Unmarshal(w.Parameters, r.CommitAuthorEmailPattern); err != nil { 750 return err 751 } 752 } 753 case RulesetRuleTypeCommitterEmailPattern: 754 r.CommitterEmailPattern = &PatternRuleParameters{} 755 756 if w.Parameters != nil { 757 if err := json.Unmarshal(w.Parameters, r.CommitterEmailPattern); err != nil { 758 return err 759 } 760 } 761 case RulesetRuleTypeBranchNamePattern: 762 r.BranchNamePattern = &PatternRuleParameters{} 763 764 if w.Parameters != nil { 765 if err := json.Unmarshal(w.Parameters, r.BranchNamePattern); err != nil { 766 return err 767 } 768 } 769 case RulesetRuleTypeTagNamePattern: 770 r.TagNamePattern = &PatternRuleParameters{} 771 772 if w.Parameters != nil { 773 if err := json.Unmarshal(w.Parameters, r.TagNamePattern); err != nil { 774 return err 775 } 776 } 777 case RulesetRuleTypeFilePathRestriction: 778 r.FilePathRestriction = &FilePathRestrictionRuleParameters{} 779 780 if w.Parameters != nil { 781 if err := json.Unmarshal(w.Parameters, r.FilePathRestriction); err != nil { 782 return err 783 } 784 } 785 case RulesetRuleTypeMaxFilePathLength: 786 r.MaxFilePathLength = &MaxFilePathLengthRuleParameters{} 787 788 if w.Parameters != nil { 789 if err := json.Unmarshal(w.Parameters, r.MaxFilePathLength); err != nil { 790 return err 791 } 792 } 793 case RulesetRuleTypeFileExtensionRestriction: 794 r.FileExtensionRestriction = &FileExtensionRestrictionRuleParameters{} 795 796 if w.Parameters != nil { 797 if err := json.Unmarshal(w.Parameters, r.FileExtensionRestriction); err != nil { 798 return err 799 } 800 } 801 case RulesetRuleTypeMaxFileSize: 802 r.MaxFileSize = &MaxFileSizeRuleParameters{} 803 804 if w.Parameters != nil { 805 if err := json.Unmarshal(w.Parameters, r.MaxFileSize); err != nil { 806 return err 807 } 808 } 809 case RulesetRuleTypeWorkflows: 810 r.Workflows = &WorkflowsRuleParameters{} 811 812 if w.Parameters != nil { 813 if err := json.Unmarshal(w.Parameters, r.Workflows); err != nil { 814 return err 815 } 816 } 817 case RulesetRuleTypeCodeScanning: 818 r.CodeScanning = &CodeScanningRuleParameters{} 819 820 if w.Parameters != nil { 821 if err := json.Unmarshal(w.Parameters, r.CodeScanning); err != nil { 822 return err 823 } 824 } 825 } 826 } 827 828 return nil 829 } 830 831 // branchRuleWrapper is a helper type to unmarshal a branch rule. 832 type branchRuleWrapper struct { 833 Type RepositoryRuleType `json:"type"` 834 BranchRuleMetadata 835 Parameters json.RawMessage `json:"parameters,omitempty"` 836 } 837 838 // UnmarshalJSON is a custom JSON unmarshaler for BranchRules. 839 func (r *BranchRules) UnmarshalJSON(data []byte) error { 840 var wrappers []*branchRuleWrapper 841 842 if err := json.Unmarshal(data, &wrappers); err != nil { 843 return err 844 } 845 846 for _, w := range wrappers { 847 switch w.Type { 848 case RulesetRuleTypeCreation: 849 r.Creation = append(r.Creation, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 850 case RulesetRuleTypeUpdate: 851 params := &UpdateRuleParameters{} 852 853 if w.Parameters != nil { 854 if err := json.Unmarshal(w.Parameters, params); err != nil { 855 return err 856 } 857 } 858 859 r.Update = append(r.Update, &UpdateBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 860 case RulesetRuleTypeDeletion: 861 r.Deletion = append(r.Deletion, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 862 case RulesetRuleTypeRequiredLinearHistory: 863 r.RequiredLinearHistory = append(r.RequiredLinearHistory, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 864 case RulesetRuleTypeMergeQueue: 865 params := &MergeQueueRuleParameters{} 866 867 if w.Parameters != nil { 868 if err := json.Unmarshal(w.Parameters, params); err != nil { 869 return err 870 } 871 } 872 873 r.MergeQueue = append(r.MergeQueue, &MergeQueueBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 874 case RulesetRuleTypeRequiredDeployments: 875 params := &RequiredDeploymentsRuleParameters{} 876 877 if w.Parameters != nil { 878 if err := json.Unmarshal(w.Parameters, params); err != nil { 879 return err 880 } 881 } 882 883 r.RequiredDeployments = append(r.RequiredDeployments, &RequiredDeploymentsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 884 case RulesetRuleTypeRequiredSignatures: 885 r.RequiredSignatures = append(r.RequiredSignatures, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 886 case RulesetRuleTypePullRequest: 887 params := &PullRequestRuleParameters{} 888 889 if w.Parameters != nil { 890 if err := json.Unmarshal(w.Parameters, params); err != nil { 891 return err 892 } 893 } 894 895 r.PullRequest = append(r.PullRequest, &PullRequestBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 896 case RulesetRuleTypeRequiredStatusChecks: 897 params := &RequiredStatusChecksRuleParameters{} 898 899 if w.Parameters != nil { 900 if err := json.Unmarshal(w.Parameters, params); err != nil { 901 return err 902 } 903 } 904 905 r.RequiredStatusChecks = append(r.RequiredStatusChecks, &RequiredStatusChecksBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 906 case RulesetRuleTypeNonFastForward: 907 r.NonFastForward = append(r.NonFastForward, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID}) 908 case RulesetRuleTypeCommitMessagePattern: 909 params := &PatternRuleParameters{} 910 911 if w.Parameters != nil { 912 if err := json.Unmarshal(w.Parameters, params); err != nil { 913 return err 914 } 915 } 916 917 r.CommitMessagePattern = append(r.CommitMessagePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 918 case RulesetRuleTypeCommitAuthorEmailPattern: 919 params := &PatternRuleParameters{} 920 921 if w.Parameters != nil { 922 if err := json.Unmarshal(w.Parameters, params); err != nil { 923 return err 924 } 925 } 926 927 r.CommitAuthorEmailPattern = append(r.CommitAuthorEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 928 case RulesetRuleTypeCommitterEmailPattern: 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.CommitterEmailPattern = append(r.CommitterEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 938 case RulesetRuleTypeBranchNamePattern: 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.BranchNamePattern = append(r.BranchNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 948 case RulesetRuleTypeTagNamePattern: 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.TagNamePattern = append(r.TagNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 958 case RulesetRuleTypeFilePathRestriction: 959 params := &FilePathRestrictionRuleParameters{} 960 961 if w.Parameters != nil { 962 if err := json.Unmarshal(w.Parameters, params); err != nil { 963 return err 964 } 965 } 966 967 r.FilePathRestriction = append(r.FilePathRestriction, &FilePathRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 968 case RulesetRuleTypeMaxFilePathLength: 969 params := &MaxFilePathLengthRuleParameters{} 970 971 if w.Parameters != nil { 972 if err := json.Unmarshal(w.Parameters, params); err != nil { 973 return err 974 } 975 } 976 977 r.MaxFilePathLength = append(r.MaxFilePathLength, &MaxFilePathLengthBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 978 case RulesetRuleTypeFileExtensionRestriction: 979 params := &FileExtensionRestrictionRuleParameters{} 980 981 if w.Parameters != nil { 982 if err := json.Unmarshal(w.Parameters, params); err != nil { 983 return err 984 } 985 } 986 987 r.FileExtensionRestriction = append(r.FileExtensionRestriction, &FileExtensionRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 988 case RulesetRuleTypeMaxFileSize: 989 params := &MaxFileSizeRuleParameters{} 990 991 if w.Parameters != nil { 992 if err := json.Unmarshal(w.Parameters, params); err != nil { 993 return err 994 } 995 } 996 997 r.MaxFileSize = append(r.MaxFileSize, &MaxFileSizeBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 998 case RulesetRuleTypeWorkflows: 999 params := &WorkflowsRuleParameters{} 1000 1001 if w.Parameters != nil { 1002 if err := json.Unmarshal(w.Parameters, params); err != nil { 1003 return err 1004 } 1005 } 1006 1007 r.Workflows = append(r.Workflows, &WorkflowsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 1008 case RulesetRuleTypeCodeScanning: 1009 params := &CodeScanningRuleParameters{} 1010 1011 if w.Parameters != nil { 1012 if err := json.Unmarshal(w.Parameters, params); err != nil { 1013 return err 1014 } 1015 } 1016 1017 r.CodeScanning = append(r.CodeScanning, &CodeScanningBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params}) 1018 } 1019 } 1020 1021 return nil 1022 } 1023 1024 // UnmarshalJSON is a custom JSON unmarshaler for RulesetRule. 1025 func (r *RepositoryRule) UnmarshalJSON(data []byte) error { 1026 w := repositoryRulesetRuleWrapper{} 1027 1028 if err := json.Unmarshal(data, &w); err != nil { 1029 return err 1030 } 1031 1032 r.Type = w.Type 1033 1034 switch r.Type { 1035 case RulesetRuleTypeCreation: 1036 r.Parameters = nil 1037 case RulesetRuleTypeUpdate: 1038 p := &UpdateRuleParameters{} 1039 1040 if w.Parameters != nil { 1041 if err := json.Unmarshal(w.Parameters, p); err != nil { 1042 return err 1043 } 1044 } 1045 1046 r.Parameters = p 1047 case RulesetRuleTypeDeletion: 1048 r.Parameters = nil 1049 case RulesetRuleTypeRequiredLinearHistory: 1050 r.Parameters = nil 1051 case RulesetRuleTypeMergeQueue: 1052 p := &MergeQueueRuleParameters{} 1053 1054 if w.Parameters != nil { 1055 if err := json.Unmarshal(w.Parameters, p); err != nil { 1056 return err 1057 } 1058 } 1059 1060 r.Parameters = p 1061 case RulesetRuleTypeRequiredDeployments: 1062 p := &RequiredDeploymentsRuleParameters{} 1063 1064 if w.Parameters != nil { 1065 if err := json.Unmarshal(w.Parameters, p); err != nil { 1066 return err 1067 } 1068 } 1069 1070 r.Parameters = p 1071 case RulesetRuleTypeRequiredSignatures: 1072 r.Parameters = nil 1073 case RulesetRuleTypePullRequest: 1074 p := &PullRequestRuleParameters{} 1075 1076 if w.Parameters != nil { 1077 if err := json.Unmarshal(w.Parameters, p); err != nil { 1078 return err 1079 } 1080 } 1081 1082 r.Parameters = p 1083 case RulesetRuleTypeRequiredStatusChecks: 1084 p := &RequiredStatusChecksRuleParameters{} 1085 1086 if w.Parameters != nil { 1087 if err := json.Unmarshal(w.Parameters, p); err != nil { 1088 return err 1089 } 1090 } 1091 1092 r.Parameters = p 1093 case RulesetRuleTypeNonFastForward: 1094 r.Parameters = nil 1095 case RulesetRuleTypeCommitMessagePattern: 1096 p := &PatternRuleParameters{} 1097 1098 if w.Parameters != nil { 1099 if err := json.Unmarshal(w.Parameters, p); err != nil { 1100 return err 1101 } 1102 } 1103 1104 r.Parameters = p 1105 case RulesetRuleTypeCommitAuthorEmailPattern: 1106 p := &PatternRuleParameters{} 1107 1108 if w.Parameters != nil { 1109 if err := json.Unmarshal(w.Parameters, p); err != nil { 1110 return err 1111 } 1112 } 1113 1114 r.Parameters = p 1115 case RulesetRuleTypeCommitterEmailPattern: 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 RulesetRuleTypeBranchNamePattern: 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 RulesetRuleTypeTagNamePattern: 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 RulesetRuleTypeFilePathRestriction: 1146 p := &FilePathRestrictionRuleParameters{} 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 RulesetRuleTypeMaxFilePathLength: 1156 p := &MaxFilePathLengthRuleParameters{} 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 RulesetRuleTypeFileExtensionRestriction: 1166 p := &FileExtensionRestrictionRuleParameters{} 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 RulesetRuleTypeMaxFileSize: 1176 p := &MaxFileSizeRuleParameters{} 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 RulesetRuleTypeWorkflows: 1186 p := &WorkflowsRuleParameters{} 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 RulesetRuleTypeCodeScanning: 1196 p := &CodeScanningRuleParameters{} 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 } 1206 1207 return nil 1208 }