Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@Ren0503
Copy link
Contributor

@Ren0503 Ren0503 commented Aug 16, 2025

No description provided.

@Ren0503 Ren0503 added this to the TinhTinh Release v2.3.1 milestone Aug 16, 2025
@Ren0503 Ren0503 linked an issue Aug 16, 2025 that may be closed by this pull request
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 16, 2025

Summary by CodeRabbit

  • New Features

    • Validation now treats “empty” consistently across types (nil, zero-length collections, zero values), improving optional field handling.
    • Nested validation only runs when nested values are present.
  • Refactor

    • Validator API updated to use a generalized emptiness check; update integrations to the new behavior.
  • Bug Fixes

    • Non-required fields are correctly skipped across all supported types, not just strings.
  • Tests

    • Expanded test coverage for optional fields, pointers, and nested validation scenarios.

Walkthrough

Replaced exported IsNil with a reflection-based IsEmpty(v any) that detects nil, nil pointers, zero-length arrays/slices/maps, and other zero values; scanner logic updated to use IsEmpty/reflect zero checks and to avoid recursing into nil pointers; tests renamed/extended to cover these cases.

Changes

Cohort / File(s) Summary
Emptiness utility refactor
dto/validator/common.go
Replaced exported IsNil with IsEmpty(v any) using reflection: returns true for nil, nil pointers, empty arrays/slices/maps, and other zero values via reflect.Value.IsZero; public API changed.
Scanner validation logic
dto/validator/scanner.go
Optional-field skipping now uses reflect.Value.IsZero(); required-field checks use IsEmpty; nested validation detects nil pointers and only recurses on non-nil pointees.
Tests update and expansion
dto/validator/common_test.go, dto/validator/scanner_test.go
Tests renamed/updated to call IsEmpty; added TestOptional to verify omitempty behavior, nil pointer skipping, and conditional nested validation.

Sequence Diagram(s)

sequenceDiagram
  actor Caller
  participant Scanner as validator.Scanner
  participant Field as Struct Field
  participant Util as validator.IsEmpty

  Caller->>Scanner: Scan(struct)
  loop per field
    Scanner->>Field: read value & tags
    alt omitempty present
      Scanner->>Field: reflect.Value.IsZero()
      alt Zero
        Scanner-->>Caller: skip field
      else Non-zero
        Scanner-->>Caller: continue
      end
    else required
      Scanner->>Util: IsEmpty(value)
      alt Empty
        Scanner-->>Caller: record error
      else Not empty
        Scanner-->>Caller: continue
      end
    end
    alt validate:"nested"
      alt Field is pointer
        Scanner->>Field: is nil?
        alt Nil
          Scanner-->>Caller: skip nested
        else Non-nil
          Scanner->>Scanner: recurse on pointee
        end
      else Non-pointer
        Scanner->>Scanner: recurse on value
      end
    end
  end
  Scanner-->>Caller: return result
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

I hop through fields with whiskers bright,
I sniff for nil in morning light.
Empty maps and slices I see,
Pointers I poke—only if they be.
A rabbit's nod to reflection's spree. 🐰✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/ren/317-allow-field-option-is-empty

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@codecov
Copy link

codecov bot commented Aug 16, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
dto/validator/common_test.go (1)

236-244: Tests correctly cover IsEmpty for nil, empty slices, and maps; consider renaming for clarity.

The assertions look good and align with the new IsEmpty semantics. Minor nit: the test function is still named Test_IsNil, which can be confusing now that the API is IsEmpty.

Example rename:

func Test_IsEmpty(t *testing.T) {
    t.Parallel()
    assert.True(t, validator.IsEmpty(nil))
    assert.True(t, validator.IsEmpty([]string{}))

    a := []interface{}{}
    assert.True(t, validator.IsEmpty(a))

    b := make(map[string]interface{})
    assert.True(t, validator.IsEmpty(b))
}
dto/validator/scanner_test.go (1)

225-249: Use validate tag key consistently (not validator) to avoid confusion.

The scanner reads the validate struct tag. Here, ContactName uses validator:"isAlphanumeric", which is ignored. While this test still passes because Contact is nil, using a consistent tag key reduces surprises.

 type Contact struct {
-    ContactName  string `json:"name" validator:"isAlphanumeric"`
+    ContactName  string `json:"name" validate:"isAlphanumeric"`
     ContactEmail string `json:"email" validate:"isEmail"`
     ContactPhone string `json:"phone"`
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 34b75b3 and 584964a.

📒 Files selected for processing (4)
  • dto/validator/common.go (1 hunks)
  • dto/validator/common_test.go (1 hunks)
  • dto/validator/scanner.go (2 hunks)
  • dto/validator/scanner_test.go (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (3)
dto/validator/scanner_test.go (1)
dto/validator/scanner.go (1)
  • Scanner (14-184)
dto/validator/scanner.go (1)
dto/validator/common.go (1)
  • IsEmpty (305-320)
dto/validator/common_test.go (1)
dto/validator/common.go (1)
  • IsEmpty (305-320)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (go)
🔇 Additional comments (2)
dto/validator/scanner.go (2)

41-43: Behavior change: optional zero values are now skipped. Verify this is intended across all types.

Switching to reflect.ValueOf(value).IsZero() means non-required fields with zero values (e.g., 0, false, "", nil pointer, empty slice/map, zero time) will skip validation. This matches “optional can be empty” but also means, for example, a non-required isInt on an int field set to 0 won’t be validated.

Confirm this is desired for all validators.


47-49: Required + pointer-to-zero-value may pass unless IsEmpty recurses (ensure fixed).

If IsEmpty only checks pointer nil-ness, required on *string where the pointer is non-nil but points to "" would incorrectly pass. After applying the IsEmpty fix to recurse into pointers, this is addressed.

Please confirm that required semantics should treat a non-nil pointer to a zero value as empty.

Comment on lines +305 to 320
func IsEmpty(v any) bool {
if v == nil {
return true
}
val := reflect.ValueOf(v)
switch val.Kind() {
case reflect.Pointer:
return val.IsNil()
case reflect.Array, reflect.Slice:
return val.Len() == 0
case reflect.Map:
return val.Len() == 0
default:
return val == nil
return val.IsZero()
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Fix reflect.Kind constant and make IsEmpty traverse pointers/interfaces (compile-time bug + semantics).

  • reflect.Kind has Ptr, not Pointer. Using reflect.Pointer will not compile.
  • Current pointer logic treats any non-nil pointer as “non-empty”, even if it points to a zero value (e.g., *string -> ""). This undermines “required” semantics for pointer fields.

Apply the following diff to fix both issues and make emptiness checks robust:

 func IsEmpty(v any) bool {
 	if v == nil {
 		return true
 	}
 	val := reflect.ValueOf(v)
 	switch val.Kind() {
-	case reflect.Pointer:
-		return val.IsNil()
-	case reflect.Array, reflect.Slice:
-		return val.Len() == 0
-	case reflect.Map:
-		return val.Len() == 0
+	case reflect.Ptr, reflect.Interface:
+		if val.IsNil() {
+			return true
+		}
+		// Recurse into the underlying value so that pointers to zero values count as empty.
+		return IsEmpty(val.Elem().Interface())
+	case reflect.Array, reflect.Slice, reflect.Map:
+		return val.Len() == 0
 	default:
 		return val.IsZero()
 	}
 }

Run the following to ensure no other occurrences of the invalid constant remain:


🏁 Script executed:

#!/bin/bash
rg -n -C2 -g '!**/vendor/**' -P '\breflect\.Pointer\b'

Length of output: 617


Fix reflect.Kind constant and expand IsEmpty pointer handling

The code currently uses the non-existent reflect.Pointer constant (it should be reflect.Ptr) and only treats top-level pointers as non-empty, even if they point to a zero value. Update both common.go and scanner.go:

• dto/validator/common.go:

  • Replace reflect.Pointer with reflect.Ptr and add reflect.Interface to recurse into underlying values so that pointers to zero values count as empty.
    • dto/validator/scanner.go:
  • Replace reflect.Pointer with reflect.Ptr.

Apply the following diffs:

--- a/dto/validator/common.go
+++ b/dto/validator/common.go
@@ -308,13 +308,18 @@ func IsEmpty(v any) bool {
 	val := reflect.ValueOf(v)
 	switch val.Kind() {
-	case reflect.Pointer:
-		return val.IsNil()
-	case reflect.Array, reflect.Slice:
-		return val.Len() == 0
-	case reflect.Map:
-		return val.Len() == 0
+	case reflect.Ptr, reflect.Interface:
+		if val.IsNil() {
+			return true
+		}
+		// Recurse into the underlying value so pointers to zero values are empty
+		return IsEmpty(val.Elem().Interface())
+	case reflect.Array, reflect.Slice, reflect.Map:
+		return val.Len() == 0
 	default:
 		return val.IsZero()
 	}
 }
--- a/dto/validator/scanner.go
+++ b/dto/validator/scanner.go
@@ -113,7 +113,7 @@ func scanFields(ct reflect.Type, data any, fields []fieldInfo) {
 				}
 			case "nested":
-				if field.Type.Kind() == reflect.Pointer {
+				if field.Type.Kind() == reflect.Ptr {
 					ptr := ct.Field(i).Interface()
 					if reflect.ValueOf(ptr).IsNil() {
 						continue
🤖 Prompt for AI Agents
In dto/validator/common.go around lines 305-320 and dto/validator/scanner.go
(where reflect.Pointer is used), replace the incorrect reflect.Pointer constant
with reflect.Ptr; in common.go also add a case for reflect.Interface and handle
both Ptr and Interface by recursing into the underlying value (checking for
IsNil first and using Elem()) so that pointers or interfaces that point to zero
values are treated as empty; update scanner.go usages to use reflect.Ptr instead
of reflect.Pointer.

Comment on lines 115 to 118
if field.Type.Kind() == reflect.Pointer {
err := Scanner(ct.Field(i).Interface())
ptr := ct.Field(i).Interface()
if reflect.ValueOf(ptr).IsNil() {
continue
}
err := Scanner(ptr)
if err != nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix pointer kind check and simplify nil guard in nested validation (compile-time bug).

reflect.Pointer is not a valid Kind; use reflect.Ptr. Also, use the field’s reflect.Value directly for the nil check to avoid interface boxing.

-            if field.Type.Kind() == reflect.Pointer {
-                ptr := ct.Field(i).Interface()
-                if reflect.ValueOf(ptr).IsNil() {
-                    continue
-                }
-                err := Scanner(ptr)
+            if field.Type.Kind() == reflect.Ptr {
+                fv := ct.Field(i)
+                if fv.IsNil() {
+                    continue
+                }
+                err := Scanner(fv.Interface())
                 if err != nil {
                     errMsg = append(errMsg, err.Error())
                 }
             } else if field.Type.Kind() == reflect.Slice {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if field.Type.Kind() == reflect.Pointer {
err := Scanner(ct.Field(i).Interface())
ptr := ct.Field(i).Interface()
if reflect.ValueOf(ptr).IsNil() {
continue
}
err := Scanner(ptr)
if err != nil {
if field.Type.Kind() == reflect.Ptr {
fv := ct.Field(i)
if fv.IsNil() {
continue
}
err := Scanner(fv.Interface())
if err != nil {
errMsg = append(errMsg, err.Error())
}
} else if field.Type.Kind() == reflect.Slice {
🤖 Prompt for AI Agents
In dto/validator/scanner.go around lines 115 to 121, the code incorrectly uses
reflect.Pointer (should be reflect.Ptr) and checks nil by boxing the pointer
into an interface; change the kind check to field.Type.Kind() == reflect.Ptr and
perform the nil guard using the field's reflect.Value (e.g., v := ct.Field(i);
if v.IsNil() { continue }) before calling Scanner on the underlying
interface/value to avoid the compile-time/type-safety bug.

@Ren0503 Ren0503 force-pushed the feat/ren/317-allow-field-option-is-empty branch from 584964a to 6d2df78 Compare August 16, 2025 06:18
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
dto/validator/common_test.go (1)

236-247: Broaden IsEmpty test coverage (nil slice vs empty slice, primitives, non-empty cases, arrays, interface-typed nils)

To lock in intended semantics and prevent regressions, add assertions for:

  • nil slice vs empty slice
  • non-empty slice/map (negative cases)
  • empty primitives (string/number/bool) and zero time.Time
  • non-nil pointer to zero-value struct (should be non-empty per current code)
  • typed nil hidden in an interface
  • arrays: zero-length vs zero-valued non-zero-length

This also documents the intended behavior difference from reflect.Value.IsZero for arrays.

 func Test_IsEmpty(t *testing.T) {
   t.Parallel()

   assert.True(t, validator.IsEmpty(nil))
   assert.True(t, validator.IsEmpty([]string{}))

   a := []interface{}{}
   assert.True(t, validator.IsEmpty(a))

   b := make(map[string]interface{})
   assert.True(t, validator.IsEmpty(b))

   type Pointer struct{}
   var c *Pointer
   assert.True(t, validator.IsEmpty(c))
+
+  // Nil slice vs empty slice
+  var s []string = nil
+  assert.True(t, validator.IsEmpty(s))
+  s2 := []string{"x"}
+  assert.False(t, validator.IsEmpty(s2))
+
+  // Non-empty map
+  b["k"] = "v"
+  assert.False(t, validator.IsEmpty(b))
+
+  // Empty primitives and zero-values
+  assert.True(t, validator.IsEmpty(""))
+  assert.True(t, validator.IsEmpty(0))
+  assert.True(t, validator.IsEmpty(0.0))
+  assert.True(t, validator.IsEmpty(false))
+  assert.True(t, validator.IsEmpty(time.Time{}))
+
+  // Non-nil pointer should be non-empty per current implementation
+  d := &Pointer{}
+  assert.False(t, validator.IsEmpty(d))
+
+  // Typed nil inside interface
+  var p *int = nil
+  var anyP interface{} = p
+  assert.True(t, validator.IsEmpty(anyP))
+
+  // Arrays: document semantics
+  var arr0 [0]int
+  assert.True(t, validator.IsEmpty(arr0))
+  var arr2 [2]int
+  assert.False(t, validator.IsEmpty(arr2)) // note: reflect.Value.IsZero(arr2) would be true
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 584964a and 6d2df78.

📒 Files selected for processing (4)
  • dto/validator/common.go (1 hunks)
  • dto/validator/common_test.go (1 hunks)
  • dto/validator/scanner.go (2 hunks)
  • dto/validator/scanner_test.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • dto/validator/scanner_test.go
  • dto/validator/scanner.go
  • dto/validator/common.go
🧰 Additional context used
🧬 Code Graph Analysis (1)
dto/validator/common_test.go (1)
dto/validator/common.go (1)
  • IsEmpty (305-320)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (go)
🔇 Additional comments (2)
dto/validator/common_test.go (2)

233-248: Rename to IsEmpty and pointer coverage look good

The test now aligns with the new IsEmpty API and correctly covers nil, empty containers, and a nil pointer case. This matches the implementation in dto/validator/common.go.


233-248: Confirm numeric and array “empty” semantics

IsEmpty currently uses reflect.Value.IsZero for scalars—so 0 and false are treated as empty—while arrays and slices are only checked via Len(), meaning a non-zero-length, zero-valued array is not empty.

Our searches show:

  • No calls to validator.IsNil(...) remain.
  • No direct uses of IsEmpty(0|0.0|false) in the codebase.

Please confirm this behavior is intentional for the scanner logic, especially for optional numeric fields where 0 may be a meaningful value.

@Ren0503 Ren0503 force-pushed the feat/ren/317-allow-field-option-is-empty branch from 6d2df78 to c0d780a Compare August 16, 2025 06:25
@Ren0503 Ren0503 merged commit 36f4508 into master Aug 16, 2025
7 of 8 checks passed
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
dto/validator/common.go (2)

311-318: Fix compile-time bug and pointer/interface semantics in IsEmpty

  • reflect.Kind has Ptr, not Pointer. This won’t compile.
  • Non-nil pointers that point to zero values (e.g., *string to "") should be treated as empty for typical “omitempty” semantics.
  • Interfaces wrapping nil/pointers need the same handling.

Apply:

 switch val.Kind() {
-	case reflect.Pointer:
-		return val.IsNil()
-	case reflect.Array, reflect.Slice:
-		return val.Len() == 0
-	case reflect.Map:
-		return val.Len() == 0
+	case reflect.Ptr, reflect.Interface:
+		if val.IsNil() {
+			return true
+		}
+		// Recurse into underlying value so pointers/interfaces to zero values are empty.
+		return IsEmpty(val.Elem().Interface())
+	case reflect.Array, reflect.Slice, reflect.Map:
+		return val.Len() == 0
 	default:
 		return val.IsZero()
 }

311-312: Replace all reflect.Pointer usages with reflect.Ptr

To avoid build errors and ensure consistency, update the two remaining occurrences of the invalid reflect.Pointer constant:

• dto/validator/common.go (around line 311)

– case reflect.Pointer:
–   return val.IsNil()
+ case reflect.Ptr:
+   return val.IsNil()

• dto/validator/scanner.go (around line 115)

– if field.Type.Kind() == reflect.Pointer {
+ if field.Type.Kind() == reflect.Ptr {
    ptr := ct.Field(i).Interface()
    err := Scanner(ptr)

Ensure any other scanner or validator logic also uses reflect.Ptr consistently.

🧹 Nitpick comments (1)
dto/validator/common.go (1)

305-319: Add tests for non-nil pointers to zero values and interface-wrapped pointers

Your current tests cover nil pointers; add cases for:

  • p := new(string) (points to ""), expect IsEmpty(p) == true
  • var v any = p, expect IsEmpty(v) == true
  • Non-empty pointer, e.g., s := "x"; p := &s, expect IsEmpty(p) == false

Example tests (dto/validator/common_test.go):

func Test_IsEmpty_PointerToZeroString(t *testing.T) {
	var s string
	p := &s
	if !validator.IsEmpty(p) {
		t.Fatalf("expected pointer to zero string to be empty")
	}
}

func Test_IsEmpty_InterfaceWrappingPointer(t *testing.T) {
	var s string
	p := &s
	var v any = p
	if !validator.IsEmpty(v) {
		t.Fatalf("expected interface-wrapped pointer to zero value to be empty")
	}
}

func Test_IsEmpty_PointerToNonZeroString(t *testing.T) {
	s := "x"
	p := &s
	if validator.IsEmpty(p) {
		t.Fatalf("expected pointer to non-zero string to be non-empty")
	}
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 6d2df78 and c0d780a.

📒 Files selected for processing (4)
  • dto/validator/common.go (1 hunks)
  • dto/validator/common_test.go (1 hunks)
  • dto/validator/scanner.go (2 hunks)
  • dto/validator/scanner_test.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • dto/validator/common_test.go
  • dto/validator/scanner_test.go
  • dto/validator/scanner.go
🧰 Additional context used
🧬 Code Graph Analysis (1)
dto/validator/common.go (2)
dto/validator/common_test.go (1)
  • Pointer (245-245)
core/ctx.go (1)
  • Map (386-386)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (go)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow Field Options Is Nil When Scan Validator

2 participants