Repository: go-sprout/sprout
Pull request #71 (2024-09-20 02:52:12)

feat: add network registry (ip,cidr,mac manipulations)
## Description
This pull request introduces the first registry addition to Sprout by adding support for the network module. This module allows manipulation and handling of network-related elements such as IP addresses, CIDR blocks, MAC addresses, and more.

## Changes
- Addition of network to the registry.
- New utilities for managing IP, CIDR, and MAC addresses.
- Base implementation to enable future extensions for network-related operations.

## Checklist
- [x] I have read the **CONTRIBUTING.md** document.
- [x] My code follows the code style of this project.
- [x] I have added tests to cover my changes.
- [x] All new and existing tests passed.
- [x] I have updated the documentation accordingly.
- [x] This change requires a change to the documentation on the website.

## Additional Information
This is the foundational work for network-related functionalities in Sprout. Future updates will expand this feature further.


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `98.78788%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.1% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.1% <93.1%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
Attention: Patch coverage is `99.04306%` with `2 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Patch % | Lines |
|---|---|---|
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | 93.5% | [2 Missing :warning: ](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) |

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/71?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/network/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/network/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9oZWxwZXJzLmdv) | `100.0% <100.0%> (ø)` | |
| [registry/network/network.go](https://app.codecov.io/gh/go-sprout/sprout/pull/71?src=pr&el=tree&filepath=registry%2Fnetwork%2Fnetwork.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvbmV0d29yay9uZXR3b3JrLmdv) | `93.5% <93.5%> (ø)` | |


Patch:
diff --git a/docs/registries/list-of-all-registries.md b/docs/registries/list-of-all-registries.md
index 9410b93..da0cbf0 100644
--- a/docs/registries/list-of-all-registries.md
+++ b/docs/registries/list-of-all-registries.md
@@ -16,6 +16,7 @@ Every function is categorized into a registry and may include a [**'must'** vers
 * [**env**](env.md): Access and manipulate environment variables within templates.
 * [**filesystem**](filesystem.md): Functions for interacting with the file system.
 * [**maps**](maps.md): Tools to manipulate and interact with map data structures.
+* [**network**](network.md): Functions to interact with network resources.
 * [**numeric**](numeric.md): Utilities for numerical operations and calculations.
 * [**random**](random.md): Functions to generate random numbers, strings, and other data.
 * [**reflect**](reflect.md): Tools to inspect and manipulate data types using reflection.
diff --git a/docs/registries/network.md b/docs/registries/network.md
new file mode 100644
index 0000000..42fbedb
--- /dev/null
+++ b/docs/registries/network.md
@@ -0,0 +1,297 @@
+---
+description: >-
+  The Network registry includes a range of utilities for working with network
+  resources, such as IP addresses, CIDR blocks, and network interfaces.
+---
+
+# Network
+
+{% hint style="info" %}
+You can easily import all the functions from the <mark style="color:yellow;">`network`</mark> registry by including the following import statement in your code
+
+```go
+import "github.com/go-sprout/sprout/registry/network"
+```
+{% endhint %}
+
+### <mark style="color:purple;">parseIP</mark>
+
+ParseIP parses a string representation of an IP address and returns its [`net.IP`](https://pkg.go.dev/net#IP) form. It attempts to parse the string as either an IPv4 or IPv6 address.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">ParseIP(str string) (net.IP, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ parseIP "10.42.0.1" }}
+// Output: net.IP{10, 42, 0, 1}
+{{ parseIP "2001:db8::" }}
+// Output: net.IP{32, 1, 13, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">parseMAC</mark>
+
+ParseMAC parses a string representation of a MAC address and returns its [`net.HardwareAddr`](https://pkg.go.dev/net#HardwareAddr) form. It attempts to parse the string as a MAC address.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">ParseMAC(str string) (net.HardwareAddr, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ parseMAC "01:23:45:67:89:ab" }}
+// Output: net.HardwareAddr{1, 35, 69, 103, 137, 171}
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">parseCIDR</mark>
+
+ParseCIDR parses a string representation of an IP address and prefix length (CIDR notation) and returns its [`*net.IPNet`](https://pkg.go.dev/net#IPNet) form. It attempts to parse the provided string as a CIDR (Classless Inter-Domain Routing) block.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">ParseCIDR(str string) (*net.IPNet, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ parseCIDR "192.168.0.0/24" }}
+// Output: &net.IPNet{IP: net.IP{192, 168, 0, 0}, Mask: net.CIDRMask(24, 32)}
+{{ parseCIDR "2001:db8::/32" }}
+// Output: &net.IPNet{IP: net.IP{32, 1, 13, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, Mask: net.CIDRMask(32, 128)}
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipVersion</mark>
+
+IPVersion determines the IP version (IPv4 or IPv6) from a string representation of an IP address. It returns the IP version as an integer (4 or 6) or an error if the provided string is not a valid IP address.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPVersion(ipStr string) (int, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ ipVersion "192.168.0.1" }} // Output: 4
+{{ ipVersion "2001:db8::" }} // Output: 6
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipIsLoopback</mark>
+
+IPIsLoopback checks if the given IP address is a loopback address. It parses the provided string as an IP address and checks whether it is a loopback address (e.g., 127.0.0.1 for IPv4, ::1 for IPv6).
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPIsLoopback(ipStr string) (bool, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ ipIsLoopback "127.0.0.1" }}  // Output: true
+{{ ipIsLoopback "192.168.0.1" }} // Output: false
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipIsGlobalUnicast</mark>
+
+IPIsGlobalUnicast checks if the given IP address is a global unicast address. It parses the provided string as an IP address and checks whether it is a global unicast address. Global unicast addresses are globally unique and routable on the public internet (not multicast, loopback, or private).
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPIsGlobalUnicast(ipStr string) (bool, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ ipIsGlobalUnicast "8.8.8.8" }} // Output: true
+{{ ipIsGlobalUnicast "127.0.0.1" }} // Output: false
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipIsMulticast</mark>
+
+IPIsMulticast checks if the given IP address is a multicast address. It parses the provided string as an IP address and checks whether it is a multicast address. Multicast addresses are used to send data to multiple receivers.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPIsMulticast(ipStr string) (bool, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ ipIsMulticast "224.0.0.1" }} // Output: true
+{{ ipIsMulticast "192.168.0.1" }} // Output: false
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipIsPrivate</mark>
+
+IPIsPrivate checks if the given IP address is a private address. It parses the provided string as an IP address and checks whether it is a private address. Private addresses are typically used for local communication within a network (e.g., 192.168.x.x).
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPIsPrivate(ipStr string) (bool, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ ipIsPrivate "192.168.0.1" }} // Output: true
+{{ ipIsPrivate "8.8.8.8" }} // Output: false
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipIncrement</mark>
+
+IPIncrement increments the given IP address by one unit, this function works for both IPv4 and IPv6 addresses. It converts the IP to the correct byte length depending on the version (IPv4 or IPv6) and increments the address by 1. In case of an overflow (e.g., incrementing 255.255.255.255 in IPv4), an error is returned.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPIncrement(ip net.IP) (net.IP, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ parseIP "192.168.0.1" | ipIncrement }} // Output: 192.168.0.2
+{{ parseIP "ffff::" | ipIncrement }}      // Output: ffff::1
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">ipDecrement</mark>
+
+IPDecrement decrements the given IP address by one unit. This function works for both IPv4 and IPv6 addresses. It converts the IP to the correct byte length depending on the version (IPv4 or IPv6) and decrements the address by 1. In case of an underflow (e.g., decrementing 0.0.0.0 in IPv4), an error is returned.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">IPDecrement(ip net.IP) (net.IP, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ parseIP "192.168.0.2" | ipDecrement }} // Output: 192.168.0.1
+{{ parseIP "ffff::1" | ipDecrement }}     // Output: ffff::
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">cidrContains</mark>
+
+CIDRContains checks if a given IP address is contained within a specified CIDR block. It parses both the CIDR block and the IP address, and checks whether the IP falls within the network range defined by the CIDR.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">CIDRContains(cidrStr string, ip string) (bool, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ cidrContains "192.168.0.0/24" "192.168.0.1" }}  // Output: true
+{{ cidrContains "192.168.0.0/24" "10.0.0.1" }}     // Output: false
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">cidrSize</mark>
+
+CIDRSize calculates the total number of IP addresses in the given CIDR block. It works for both IPv4 and IPv6 CIDR blocks. The function returns the total number of IP addresses as a big.Int value, which can be used for large CIDR blocks.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">CIDRSize(cidrStr string) (*big.Int, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ cidrSize "192.168.0.0/24" }}   // Output: 256
+{{ cidrSize "2001:db8::/32" }}    // Output: 79228162514264337593543950336
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">cidrRangeList</mark>
+
+CIDRRangeList generates a list of all IP addresses within the given CIDR block. It works for both IPv4 and IPv6 CIDR blocks, returning a list of all IP addresses as strings. This function is useful for iterating over all IP addresses in a CIDR block or generating a list of IP addresses for further processing.
+
+{% hint style="warning" %}
+Be careful, this method can generate a large number of IP addresses for large CIDR blocks, which may consume a significant amount of memory and processing time.
+{% endhint %}
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">CIDRRangeList(cidrStr string) ([]net.IP, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ cidrRangeList "10.42.1.1/32" }} // Output: [10.42.1.1]
+{{ cidrRangeList "2001:db8::/128" }} // Output: [2001:db8::]
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">cidrFirst</mark>
+
+CIDRFirst returns the first IP address in the given CIDR block.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">CIDRFirst(cidrStr string) (string, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ cidrFirst "10.42.0.0/24" }} // Output: 10.42.0.0
+{{ cidrFirst "2001:db8::/32" }} // Output: 2001:db8::
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">cidrLast</mark>
+
+CIDRLast returns the last IP address in the given CIDR block.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">CIDRLast(cidrStr string) (string, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ cidrLast "10.42.0.0/24" }} // Output: 10.42.0.255
+{{ cidrLast "2001:db8::/32" }} // Output: 2001:db8::ffff:ffff
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">cidrOverlap</mark>
+
+CIDROverlap checks if two CIDR blocks overlap. It parses both CIDR blocks and determines whether they overlap. Two CIDR blocks overlap if they have at least one IP address in common. The function returns true if the CIDR blocks overlap, and false otherwise.
+
+<table data-header-hidden>
+  <thead><tr><th width="174">Name</th><th>Value</th></tr></thead>
+  <tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">CIDROverlap(cidrStrA, cidrStrB string) (bool, error)</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ cidrOverlap "10.42.0.0/24" "10.42.0.0/16" }} // Output: true
+{{ cidrOverlap "192.168.1.0/24" "192.168.2.0/24" }} // Output: false
+{{ cidrOverlap "2001:db8::/64" "2001:db8::/32" }} // Output: true
+{{ cidrOverlap "2001:db8::/64" "2001:db8:1::/64" }} // Output: false
+```
+{% endtab %}
+{% endtabs %}
diff --git a/registry/network/functions.go b/registry/network/functions.go
new file mode 100644
index 0000000..5276841
--- /dev/null
+++ b/registry/network/functions.go
@@ -0,0 +1,521 @@
+package network
+
+import (
+	"errors"
+	"fmt"
+	"math/big"
+	"net"
+)
+
+// ParseIP parses a string representation of an IP address and returns its [net.IP] form.
+//
+// It attempts to parse the string as either an IPv4 or IPv6 address.
+// If the provided string is not a valid IP address, an error is returned.
+//
+// Parameters:
+//
+//	str string - the string representation of the IP address.
+//
+// Returns:
+//
+//	net.IP - the parsed IP address in its net.IP format.
+//	error - an error if the string cannot be parsed as a valid IP address.
+//
+// Example:
+//
+//	{{ parseIP "10.42.0.1" }} // Output: net.IP{10, 42, 0, 1}
+//	{{ parseIP "2001:db8::" }} // Output: net.IP{32, 1, 13, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+func (nr *NetworkRegistry) ParseIP(str string) (net.IP, error) {
+	ip := net.ParseIP(str)
+	if ip == nil {
+		return nil, errors.New("invalid IP address")
+	}
+
+	return ip, nil
+}
+
+// ParseMAC parses a string representation of a MAC address and returns its [net.HardwareAddr] form.
+//
+// It attempts to parse the provided string as a MAC address. If the string is not a valid MAC address,
+// an error is returned.
+//
+// Parameters:
+//
+//	str string - the string representation of the MAC address.
+//
+// Returns:
+//
+//	net.HardwareAddr - the parsed MAC address in its net.HardwareAddr format.
+//	error - an error if the string cannot be parsed as a valid MAC address.
+//
+// Example:
+//
+//	{{ parseMAC "01:23:45:67:89:ab" }} // Output: net.HardwareAddr{1, 35, 69, 103, 137, 171}
+func (nr *NetworkRegistry) ParseMAC(str string) (net.HardwareAddr, error) {
+	mac, err := net.ParseMAC(str)
+	if err != nil {
+		return nil, fmt.Errorf("cannot parse MAC address: %w", err)
+	}
+
+	return mac, nil
+}
+
+// ParseCIDR parses a string representation of an IP address and prefix length (CIDR notation)
+// and returns its [*net.IPNet] form.
+//
+// It attempts to parse the provided string as a CIDR (Classless Inter-Domain Routing) block.
+// If the string is not valid CIDR notation, an error is returned.
+//
+// Parameters:
+//
+//	str string - the string representation of the CIDR block.
+//
+// Returns:
+//
+//	*net.IPNet - the parsed IP network in its *net.IPNet format.
+//	error - an error if the string cannot be parsed as valid CIDR notation.
+//
+// Example:
+//
+//	{{ parseCIDR "192.168.0.0/24" }}  // Output: &net.IPNet{IP: net.IP{192, 168, 0, 0}, Mask: net.CIDRMask(24, 32)}
+//	{{ parseCIDR "2001:db8::/32" }}   // Output: &net.IPNet{IP: net.IP{32, 1, 13, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, Mask: net.CIDRMask(32, 128)}
+func (nr *NetworkRegistry) ParseCIDR(str string) (*net.IPNet, error) {
+	_, cidr, err := net.ParseCIDR(str)
+	if err != nil {
+		return nil, fmt.Errorf("cannot parse CIDR: %w", err)
+	}
+
+	return cidr, nil
+}
+
+// IPVersion determines the IP version (IPv4 or IPv6) from a string
+// representation of an IP address.
+//
+// Parameters:
+//
+//	ipStr string - the string representation of the IP address.
+//
+// Returns:
+//
+//	uint8 - the IP version, 4 for IPv4 or 16 for IPv6.
+//	error - an error if the IP address is invalid or cannot be parsed.
+//
+// Example:
+//
+//	{{ ipVersion "192.168.0.1" }} // Output: 4
+//	{{ ipVersion "2001:db8::" }} // Output: 6
+func (nr *NetworkRegistry) IPVersion(ipStr string) (uint8, error) {
+	ip, err := nr.ParseIP(ipStr)
+	if err != nil {
+		return 0, err
+	}
+
+	return nr.determineIPVersion(ip), nil
+}
+
+// IPIsLoopback checks if the given IP address is a loopback address.
+//
+// It parses the provided string as an IP address and checks whether it is a
+// loopback address (e.g., 127.0.0.1 for IPv4, ::1 for IPv6).
+//
+// Parameters:
+//
+//	ipStr string - the string representation of the IP address.
+//
+// Returns:
+//
+//	bool - true if the IP address is a loopback address.
+//	error - an error if the IP address is invalid or cannot be parsed.
+//
+// Example:
+//
+//	{{ ipIsLoopback "127.0.0.1" }}  // Output: true
+//	{{ ipIsLoopback "192.168.0.1" }} // Output: false
+func (nr *NetworkRegistry) IPIsLoopback(ipStr string) (bool, error) {
+	ip, err := nr.ParseIP(ipStr)
+	if err != nil {
+		return false, err
+	}
+
+	return ip.IsLoopback(), nil
+}
+
+// IPIsGlobalUnicast checks if the given IP address is a global unicast address.
+//
+// It parses the provided string as an IP address and checks whether it is a
+// global unicast address. Global unicast addresses are globally unique and routable
+// (not multicast, loopback, or private).
+//
+// Parameters:
+//
+//	ipStr string - the string representation of the IP address.
+//
+// Returns:
+//
+//	bool - true if the IP address is a global unicast address.
+//	error - an error if the IP address is invalid or cannot be parsed.
+//
+// Example:
+//
+//	{{ ipIsGlobalUnicast "8.8.8.8" }} // Output: true
+//	{{ ipIsGlobalUnicast "127.0.0.1" }} // Output: false
+func (nr *NetworkRegistry) IPIsGlobalUnicast(ipStr string) (bool, error) {
+	ip, err := nr.ParseIP(ipStr)
+	if err != nil {
+		return false, err
+	}
+
+	return ip.IsGlobalUnicast(), nil
+}
+
+// IPIsMulticast checks if the given IP address is a multicast address.
+//
+// It parses the provided string as an IP address and checks whether it is a
+// multicast address. Multicast addresses are used to send data to multiple receivers.
+//
+// Parameters:
+//
+//	ipStr string - the string representation of the IP address.
+//
+// Returns:
+//
+//	bool - true if the IP address is a multicast address.
+//	error - an error if the IP address is invalid or cannot be parsed.
+//
+// Example:
+//
+//	{{ ipIsMulticast "224.0.0.1" }} // Output: true
+//	{{ ipIsMulticast "192.168.0.1" }} // Output: false
+func (nr *NetworkRegistry) IPIsMulticast(ipStr string) (bool, error) {
+	ip, err := nr.ParseIP(ipStr)
+	if err != nil {
+		return false, err
+	}
+
+	return ip.IsMulticast(), nil
+}
+
+// IPIsPrivate checks if the given IP address is a private address.
+//
+// It parses the provided string as an IP address and checks whether it is
+// a private address. Private addresses are typically used for local
+// communication within a network (e.g., 192.168.x.x).
+//
+// Parameters:
+//
+//	ipStr string - the string representation of the IP address.
+//
+// Returns:
+//
+//	bool - true if the IP address is a private address.
+//	error - an error if the IP address is invalid or cannot be parsed.
+//
+// Example:
+//
+//	{{ ipIsPrivate "192.168.0.1" }} // Output: true
+//	{{ ipIsPrivate "8.8.8.8" }} // Output: false
+func (nr *NetworkRegistry) IPIsPrivate(ipStr string) (bool, error) {
+	ip, err := nr.ParseIP(ipStr)
+	if err != nil {
+		return false, err
+	}
+
+	return ip.IsPrivate(), nil
+}
+
+// IPIncrement increments the given IP address by one unit.
+// This function works for both IPv4 and IPv6 addresses.
+//
+// It converts the IP to the correct byte length depending on the version (IPv4 or IPv6)
+// and increments the address by 1. In case of an overflow (e.g., incrementing
+// 255.255.255.255 in IPv4), an error is returned.
+//
+// Parameters:
+//
+//	ip net.IP - the IP address to increment.
+//
+// Returns:
+//
+//	net.IP - the incremented IP address.
+//	error - an error if the IP address overflows or if the IP version cannot be determined.
+//
+// Example:
+//
+//	{{ parseIP "192.168.0.1" | ipIncrement }} // Output: 192.168.0.2
+//	{{ parseIP "ffff::" | ipIncrement }}      // Output: ffff::1
+func (nr *NetworkRegistry) IPIncrement(ip net.IP) (net.IP, error) {
+	switch nr.determineIPVersion(ip) {
+	case 4:
+		ip = ip.To4()
+	case 6:
+		ip = ip.To16()
+	}
+
+	inc := 1 // increment value
+	for i := len(ip) - 1; i >= 0 && inc > 0; i-- {
+		if ip[i]+byte(inc) < ip[i] { // detect overflow
+			ip[i] = 0
+		} else {
+			ip[i] += byte(inc)
+			inc = 0 // stop further increments
+		}
+	}
+
+	if inc > 0 {
+		return net.IP{}, errors.New("ip increment overflow")
+	}
+
+	return ip, nil
+}
+
+// IPDecrement decrements the given IP address by one unit.
+// This function works for both IPv4 and IPv6 addresses.
+//
+// It converts the IP to the correct byte length depending on the version (IPv4 or IPv6)
+// and decrements the address by 1. In case of an underflow (e.g., decrementing
+// 0.0.0.0 in IPv4), an error is returned.
+//
+// Parameters:
+//
+//	ip net.IP - the IP address to decrement.
+//
+// Returns:
+//
+//	net.IP - the decremented IP address.
+//	error - an error if the IP address underflows or if the IP version cannot be determined.
+//
+// Example:
+//
+//	{{ parseIP "192.168.0.2" | ipDecrement }} // Output: 192.168.0.1
+//	{{ parseIP "ffff::1" | ipDecrement }}     // Output: ffff::
+func (nr *NetworkRegistry) IPDecrement(ip net.IP) (net.IP, error) {
+	switch nr.determineIPVersion(ip) {
+	case 4:
+		ip = ip.To4()
+	case 6:
+		ip = ip.To16()
+	}
+
+	dec := 1 // decrement value
+	for i := len(ip) - 1; i >= 0 && dec > 0; i-- {
+		if ip[i] < byte(dec) { // detect underflow
+			ip[i] = 0xFF
+		} else {
+			ip[i] -= byte(dec)
+			dec = 0 // stop further decrements
+		}
+	}
+
+	if dec > 0 {
+		return net.IP{}, errors.New("ip decrement underflow")
+	}
+
+	return ip, nil
+}
+
+// CIDRContains checks if a given IP address is contained within a specified CIDR block.
+//
+// It parses both the CIDR block and the IP address, and checks whether the IP falls
+// within the network range defined by the CIDR. If either the CIDR or the IP address is invalid,
+// an error is returned.
+//
+// Parameters:
+//
+//	cidrStr string - the string representation of the CIDR block.
+//	ip string - the string representation of the IP address to check.
+//
+// Returns:
+//
+//	bool - true if the IP address is within the CIDR block, false otherwise.
+//	error - an error if the CIDR block or IP address cannot be parsed.
+//
+// Example:
+//
+//	{{ cidrContains "192.168.0.0/24" "192.168.0.1" }}  // Output: true
+//	{{ cidrContains "192.168.0.0/24" "10.0.0.1" }}     // Output: false
+func (nr *NetworkRegistry) CIDRContains(cidrStr string, ip string) (bool, error) {
+	parsedCIRDR, err := nr.ParseCIDR(cidrStr)
+	if err != nil {
+		return false, err
+	}
+
+	parsedIP, err := nr.ParseIP(ip)
+	if err != nil {
+		return false, err
+	}
+
+	return parsedCIRDR.Contains(parsedIP), nil
+}
+
+// CIDRSize calculates the total number of IP addresses in the given CIDR block.
+// It works for both IPv4 and IPv6 CIDR blocks.
+//
+// The function parses the CIDR string, determines the IP version, and calculates the
+// size of the network range based on the prefix length.
+//
+// Parameters:
+//
+//	cidr string - the string representation of the CIDR block.
+//
+// Returns:
+//
+//	*big.Int - the total number of IP addresses in the CIDR block.
+//	error - an error if the CIDR block cannot be parsed.
+//
+// Example:
+//
+//	{{ cidrSize "192.168.0.0/24" }}   // Output: 256
+//	{{ cidrSize "2001:db8::/32" }}    // Output: 79228162514264337593543950336 (IPv6 range)
+func (nr *NetworkRegistry) CIDRSize(cidrStr string) (*big.Int, error) {
+	cidr, err := nr.ParseCIDR(cidrStr)
+	if err != nil {
+		return nil, err
+	}
+
+	ones, bits := cidr.Mask.Size()
+
+	// Calculate the number of addresses: 2^(bits - ones)
+	// Use big.Int for handling large values
+	size := new(big.Int)
+	size.Exp(big.NewInt(2), big.NewInt(int64(bits-ones)), nil)
+
+	return size, nil
+}
+
+// CIDRRangeList generates a list of all IP addresses within the given CIDR block.
+// It works for both IPv4 and IPv6 CIDR blocks,
+// ! WARNING that generating all IPs in a large IPv4/IPv6 block may consume
+// ! significant memory and processing time.
+//
+// Parameters:
+//
+//	cidr string - the string representation of the CIDR block.
+//
+// Returns:
+//
+//	[]net.IP - a slice containing all IP addresses within the CIDR block.
+//	error - an error if the CIDR block cannot be parsed.
+//
+// Example:
+//
+//	{{ range cidrRangeList "10.42.1.1/32" }}{{ . }}{{ end }} // Output: 10.42.1.1
+//	{{ range cidrRangeList "2001:db8::/128" }}{{ . }}{{ end }} // Output: 2001:db8::
+func (nr *NetworkRegistry) CIDRRangeList(cidrStr string) ([]net.IP, error) {
+	cidr, err := nr.ParseCIDR(cidrStr)
+	if err != nil {
+		return nil, fmt.Errorf("invalid CIDR block: %w", err)
+	}
+
+	// Get the starting IP
+	startIP := cidr.IP
+	ones, bits := cidr.Mask.Size()
+	totalIPs := new(big.Int).Exp(big.NewInt(2), big.NewInt(int64(bits-ones)), nil)
+
+	// Prepare a slice to store all IP addresses
+	ipList := make([]net.IP, 0, totalIPs.Int64())
+
+	// Use a big.Int to increment IP addresses, as they can
+	// overflow standard integer types
+	currentIP := new(big.Int).SetBytes(startIP)
+
+	for i := big.NewInt(0); i.Cmp(totalIPs) < 0; i.Add(i, big.NewInt(1)) {
+		// Convert the current big.Int to an IP address
+		ipBytes := currentIP.Bytes()
+
+		// Convert back to net.IP format (ensuring the length is correct for IPv4 or IPv6)
+		ip := make(net.IP, len(startIP))
+		copy(ip[len(ip)-len(ipBytes):], ipBytes)
+
+		ipList = append(ipList, ip)
+
+		// Increment the current IP
+		currentIP.Add(currentIP, big.NewInt(1))
+	}
+
+	return ipList, nil
+}
+
+// CIDRFirst returns the first IP address in the given CIDR block.
+//
+// Parameters:
+//
+//	cidrStr string - the string representation of the CIDR block.
+//
+// Returns:
+//
+//	string - the first IP address as a string.
+//	error - an error if the CIDR block cannot be parsed.
+//
+// Example:
+//
+//	{{ cidrFirst "10.42.0.0/24" }} // Output: 10.42.0.0
+//	{{ cidrFirst "2001:db8::/32" }} // Output: 2001:db8::
+func (nr *NetworkRegistry) CIDRFirst(cidrStr string) (string, error) {
+	cidr, err := nr.ParseCIDR(cidrStr)
+	if err != nil {
+		return "", err
+	}
+
+	return cidr.IP.String(), nil
+}
+
+// CIDRLast returns the last IP address in the given CIDR block.
+//
+// Parameters:
+//
+//	cidrStr string - the string representation of the CIDR block.
+//
+// Returns:
+//
+//	string - the last IP address as a string.
+//	error - an error if the CIDR block cannot be parsed.
+//
+// Example:
+//
+//	{{ cidrLast "10.42.0.0/24" }} // Output: 10.42.0.255
+//	{{ cidrLast "2001:db8::/32" }} // Output: 2001:db8::ffff:ffff
+func (nr *NetworkRegistry) CIDRLast(cidrStr string) (string, error) {
+	cidr, err := nr.ParseCIDR(cidrStr)
+	if err != nil {
+		return "", err
+	}
+
+	return nr.calculateLastIP(cidr).String(), nil
+}
+
+// CIDROverlap checks if two CIDR blocks overlap.
+// It parses both CIDR blocks and determines whether they overlap.
+//
+// Parameters:
+//
+//	cidrStrA string - the first CIDR block.
+//	cidrStrB string - the second CIDR block.
+//
+// Returns:
+//
+//	bool - true if the two CIDR blocks overlap, false otherwise.
+//	error - an error if either of the CIDR blocks cannot be parsed.
+//
+// Example:
+//
+//	{{ cidrOverlap "10.42.0.0/24" "10.42.0.0/16" }} // Output: true
+//	{{ cidrOverlap "192.168.1.0/24" "192.168.2.0/24" }} // Output: false
+//	{{ cidrOverlap "2001:db8::/64" "2001:db8::/32" }} // Output: true
+//	{{ cidrOverlap "2001:db8::/64" "2001:db8:1::/64" }} // Output: false
+func (nr *NetworkRegistry) CIDROverlap(cidrStrA, cidrStrB string) (bool, error) {
+	cidrA, err := nr.ParseCIDR(cidrStrA)
+	if err != nil {
+		return false, err
+	}
+
+	cidrB, err := nr.ParseCIDR(cidrStrB)
+	if err != nil {
+		return false, err
+	}
+
+	return cidrB.Contains(cidrA.IP.To16()) ||
+			cidrB.Contains(nr.calculateLastIP(cidrA)) ||
+			cidrA.Contains(cidrB.IP.To16()) ||
+			cidrA.Contains(nr.calculateLastIP(cidrB)),
+		nil
+}
diff --git a/registry/network/helpers.go b/registry/network/helpers.go
new file mode 100644
index 0000000..5b581ad
--- /dev/null
+++ b/registry/network/helpers.go
@@ -0,0 +1,50 @@
+package network
+
+import (
+	"net"
+)
+
+// determineIPVersion determines the IP version (IPv4 or IPv6) for a given net.IP.
+//
+// It checks the length of the IP address to identify the IP version:
+// - Returns 4 if it's an IPv4 address.
+// - Returns 6 if it's an IPv6 address.
+//
+// Parameters:
+//
+//	ip net.IP - the IP address to check.
+//
+// Returns:
+//
+//	uint8 - 4 for IPv4, 6 for IPv6.
+func (nr *NetworkRegistry) determineIPVersion(ip net.IP) uint8 {
+	// Check if it's an IPv4 address
+	if len(ip) == net.IPv4len || (len(ip) == net.IPv6len && ip.To4() != nil) {
+		return 4
+	}
+
+	return 6
+}
+
+// calculateLastIP calculates the last IP address in the range for the given CIDR block.
+//
+// It takes the network address and applies the subnet mask to find the last usable IP in the CIDR range.
+//
+// Parameters:
+//
+//	cidr *net.IPNet - the CIDR block.
+//
+// Returns:
+//
+//	net.IP - the last IP address in the CIDR block.
+func (nr *NetworkRegistry) calculateLastIP(cidr *net.IPNet) net.IP {
+	// Get the last IP of the CIDR
+	lastIP := make(net.IP, len(cidr.IP))
+	copy(lastIP, cidr.IP)
+
+	for i := 0; i < len(cidr.Mask); i++ {
+		lastIP[i] |= ^cidr.Mask[i]
+	}
+
+	return lastIP
+}
diff --git a/registry/network/network.go b/registry/network/network.go
new file mode 100644
index 0000000..78001d2
--- /dev/null
+++ b/registry/network/network.go
@@ -0,0 +1,56 @@
+package network
+
+import (
+	"github.com/go-sprout/sprout"
+)
+
+type NetworkRegistry struct {
+	handler sprout.Handler // Embedding Handler for shared functionality
+}
+
+// NewRegistry creates a new instance of your registry with the embedded Handler.
+func NewRegistry() *NetworkRegistry {
+	return &NetworkRegistry{}
+}
+
+// Uid returns the unique identifier of the registry.
+func (nr *NetworkRegistry) Uid() string {
+	return "network" // ! Must be unique and in camel case
+}
+
+// LinkHandler links the handler to the registry at runtime.
+func (nr *NetworkRegistry) LinkHandler(fh sprout.Handler) error {
+	nr.handler = fh
+	return nil
+}
+
+// RegisterFunctions registers all functions of the registry.
+func (nr *NetworkRegistry) RegisterFunctions(funcsMap sprout.FunctionMap) error {
+	sprout.AddFunction(funcsMap, "parseIP", nr.ParseIP)
+	sprout.AddFunction(funcsMap, "parseMAC", nr.ParseMAC)
+	sprout.AddFunction(funcsMap, "parseCIDR", nr.ParseCIDR)
+	sprout.AddFunction(funcsMap, "ipVersion", nr.IPVersion)
+	sprout.AddFunction(funcsMap, "ipIsLoopback", nr.IPIsLoopback)
+	sprout.AddFunction(funcsMap, "ipIsGlobalUnicast", nr.IPIsGlobalUnicast)
+	sprout.AddFunction(funcsMap, "ipIsMulticast", nr.IPIsMulticast)
+	sprout.AddFunction(funcsMap, "ipIsPrivate", nr.IPIsPrivate)
+	sprout.AddFunction(funcsMap, "ipIncrement", nr.IPIncrement)
+	sprout.AddFunction(funcsMap, "ipDecrement", nr.IPDecrement)
+	sprout.AddFunction(funcsMap, "cidrContains", nr.CIDRContains)
+	sprout.AddFunction(funcsMap, "cidrSize", nr.CIDRSize)
+	sprout.AddFunction(funcsMap, "cidrRangeList", nr.CIDRRangeList)
+	sprout.AddFunction(funcsMap, "cidrFirst", nr.CIDRFirst)
+	sprout.AddFunction(funcsMap, "cidrLast", nr.CIDRLast)
+	sprout.AddFunction(funcsMap, "cidrOverlap", nr.CIDROverlap)
+	return nil
+}
+
+func (nr *NetworkRegistry) RegisterAliases(aliasMap sprout.FunctionAliasMap) error {
+	// Register your alias here if you have any or remove this method
+	return nil
+}
+
+func (nr *NetworkRegistry) RegisterNotices(notices *[]sprout.FunctionNotice) error {
+	// Register your notices here if you have any or remove this method
+	return nil
+}


Test patch:
diff --git a/registry/network/functions_test.go b/registry/network/functions_test.go
new file mode 100644
index 0000000..930f717
--- /dev/null
+++ b/registry/network/functions_test.go
@@ -0,0 +1,229 @@
+package network_test
+
+import (
+	"testing"
+
+	"github.com/go-sprout/sprout/pesticide"
+	"github.com/go-sprout/sprout/registry/network"
+)
+
+func TestParseIP(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "ValidIPv4", Input: `{{ .V | parseIP }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedOutput: "10.42.0.1"},
+		{Name: "ValidIPv6", Input: `{{ .V | parseIP }}`, Data: map[string]any{"V": "2001:db8::"}, ExpectedOutput: "2001:db8::"},
+		{Name: "InvalidIP", Input: `{{ .V | parseIP }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+		{Name: "EmptyIP", Input: `{{ .V | parseIP }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestParseMAC(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "ValidMAC", Input: `{{ .V | parseMAC }}`, Data: map[string]any{"V": "01:23:45:67:89:ab"}, ExpectedOutput: "01:23:45:67:89:ab"},
+		{Name: "InvalidMAC", Input: `{{ .V | parseMAC }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "cannot parse MAC address"},
+		{Name: "EmptyMAC", Input: `{{ .V | parseMAC }}`, Data: map[string]any{"V": ""}, ExpectedErr: "cannot parse MAC address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestParseCIDR(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "ValidCIDR", Input: `{{ .V | parseCIDR }}`, Data: map[string]any{"V": "10.42.0.0/24"}, ExpectedOutput: "10.42.0.0/24"},
+		{Name: "ValidCIDRWithIP", Input: `{{ .V | parseCIDR }}`, Data: map[string]any{"V": "10.42.0.2/24"}, ExpectedOutput: "10.42.0.0/24"},
+		{Name: "InvalidCIDR", Input: `{{ .V | parseCIDR }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid CIDR address"},
+		{Name: "EmptyCIDR", Input: `{{ .V | parseCIDR }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid CIDR address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPVersion(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "IPv4", Input: `{{ .V | ipVersion }}`, Data: map[string]any{"V": "10.42.0.0"}, ExpectedOutput: "4"},
+		{Name: "IPv6", Input: `{{ .V | ipVersion }}`, Data: map[string]any{"V": "2001:db8::"}, ExpectedOutput: "6"},
+		{Name: "MixedIP", Input: `{{ .V | ipVersion }}`, Data: map[string]any{"V": "2001:db8::10.42.0.1"}, ExpectedOutput: "6"},
+		{Name: "InvalidIP", Input: `{{ .V | ipVersion }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+		{Name: "EmptyIP", Input: `{{ .V | ipVersion }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPIsLoopback(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "LoopbackIPv4", Input: `{{ .V | ipIsLoopback }}`, Data: map[string]any{"V": "127.0.0.1"}, ExpectedOutput: "true"},
+		{Name: "LoopbackIPv6", Input: `{{ .V | ipIsLoopback }}`, Data: map[string]any{"V": "::1"}, ExpectedOutput: "true"},
+		{Name: "NonLoopbackIPv4", Input: `{{ .V | ipIsLoopback }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedOutput: "false"},
+		{Name: "NonLoopbackIPv6", Input: `{{ .V | ipIsLoopback }}`, Data: map[string]any{"V": "2001:db8::"}, ExpectedOutput: "false"},
+		{Name: "InvalidIP", Input: `{{ .V | ipIsLoopback }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+		{Name: "EmptyIP", Input: `{{ .V | ipIsLoopback }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPIsGlobalUnicast(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "GlobalUnicastIPv4", Input: `{{ .V | ipIsGlobalUnicast }}`, Data: map[string]any{"V": "8.8.8.8"}, ExpectedOutput: "true"},
+		{Name: "GlobalUnicastIPv6", Input: `{{ .V | ipIsGlobalUnicast }}`, Data: map[string]any{"V": "2001:4860:4860::8888"}, ExpectedOutput: "true"},
+		{Name: "NonGlobalUnicastIPv4", Input: `{{ .V | ipIsGlobalUnicast }}`, Data: map[string]any{"V": "127.0.0.1"}, ExpectedOutput: "false"},
+		{Name: "NonGlobalUnicastIPv6", Input: `{{ .V | ipIsGlobalUnicast }}`, Data: map[string]any{"V": "::1"}, ExpectedOutput: "false"},
+		{Name: "InvalidIP", Input: `{{ .V | ipIsGlobalUnicast }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+		{Name: "EmptyIP", Input: `{{ .V | ipIsGlobalUnicast }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPIsMulticast(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "MulticastIPv4", Input: `{{ .V | ipIsMulticast }}`, Data: map[string]any{"V": "224.0.0.1"}, ExpectedOutput: "true"},
+		{Name: "MulticastIPv6", Input: `{{ .V | ipIsMulticast }}`, Data: map[string]any{"V": "ff02::1"}, ExpectedOutput: "true"},
+		{Name: "NonMulticastIPv4", Input: `{{ .V | ipIsMulticast }}`, Data: map[string]any{"V": "127.0.0.1"}, ExpectedOutput: "false"},
+		{Name: "NonMulticastIPv6", Input: `{{ .V | ipIsMulticast }}`, Data: map[string]any{"V": "::1"}, ExpectedOutput: "false"},
+		{Name: "InvalidIP", Input: `{{ .V | ipIsMulticast }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+		{Name: "EmptyIP", Input: `{{ .V | ipIsMulticast }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPIsPrivate(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "PrivateIPv4", Input: `{{ .V | ipIsPrivate }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedOutput: "true"},
+		{Name: "PrivateIPv6", Input: `{{ .V | ipIsPrivate }}`, Data: map[string]any{"V": "fd00::1"}, ExpectedOutput: "true"},
+		{Name: "NonPrivateIPv4", Input: `{{ .V | ipIsPrivate }}`, Data: map[string]any{"V": "42.42.42.42"}, ExpectedOutput: "false"},
+		{Name: "NonPrivateIPv6", Input: `{{ .V | ipIsPrivate }}`, Data: map[string]any{"V": "2001:db8::"}, ExpectedOutput: "false"},
+		{Name: "InvalidIP", Input: `{{ .V | ipIsPrivate }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+		{Name: "EmptyIP", Input: `{{ .V | ipIsPrivate }}`, Data: map[string]any{"V": ""}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPIncrement(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "IncrementOverBasic", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedOutput: "10.42.0.2"},
+		{Name: "IncrementToMax", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "10.42.254.254"}, ExpectedOutput: "10.42.254.255"},
+		{Name: "IncrementOverMax", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "10.42.254.255"}, ExpectedOutput: "10.42.255.0"},
+		{Name: "IncrementOverMaxTwice", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "10.42.255.255"}, ExpectedOutput: "10.43.0.0"},
+		{Name: "IncrementOverMaxThrice", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "10.255.255.255"}, ExpectedOutput: "11.0.0.0"},
+		{Name: "IncrementOverflow", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "255.255.255.255"}, ExpectedErr: "ip increment overflow"},
+		{Name: "IncrementIPv6", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "2001:db8::1"}, ExpectedOutput: "2001:db8::2"},
+		{Name: "IncrementIPv6ToMax", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "2001:db8::ffff"}, ExpectedOutput: "2001:db8::1:0"},
+		{Name: "IncrementIPv6OverMax", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "2001:db8::1:ffff"}, ExpectedOutput: "2001:db8::2:0"},
+		{Name: "IncrementIPv6OverMaxTwice", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "2001:db8::ffff:ffff"}, ExpectedOutput: "2001:db8::1:0:0"},
+		{Name: "IncrementIPv6Overflow", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"}, ExpectedErr: "ip increment overflow"},
+		{Name: "IncrementInvalidIP", Input: `{{ .V | parseIP | ipIncrement }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestIPDecrement(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "DecrementOverBasic", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "10.42.0.2"}, ExpectedOutput: "10.42.0.1"},
+		{Name: "DecrementToMin", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedOutput: "10.42.0.0"},
+		{Name: "DecrementOverMin", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "10.42.1.0"}, ExpectedOutput: "10.42.0.255"},
+		{Name: "DecrementOverMinTwice", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "10.42.0.0"}, ExpectedOutput: "10.41.255.255"},
+		{Name: "DecrementOverMinThrice", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "10.0.0.0"}, ExpectedOutput: "9.255.255.255"},
+		{Name: "DecrementUnderflow", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "0.0.0.0"}, ExpectedErr: "ip decrement underflow"},
+		{Name: "DecrementIPv6", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "2001:db8::2"}, ExpectedOutput: "2001:db8::1"},
+		{Name: "DecrementIPv6ToMin", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "2001:db8::1"}, ExpectedOutput: "2001:db8::"},
+		{Name: "DecrementIPv6OverMin", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "2001:db8::1:0"}, ExpectedOutput: "2001:db8::ffff"},
+		{Name: "DecrementIPv6OverMinTwice", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "2001:db8::1:0:0"}, ExpectedOutput: "2001:db8::ffff:ffff"},
+		{Name: "DecrementIPv6Underflow", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "0:0:0:0:0:0:0:0"}, ExpectedErr: "ip decrement underflow"},
+		{Name: "DecrementInvalidIP", Input: `{{ .V | parseIP | ipDecrement }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestCIDRContains(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "IPv4Contains", Input: `{{ .V | cidrContains "10.42.0.0/16" }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedOutput: "true"},
+		{Name: "IPv4NotContains", Input: `{{ .V | cidrContains "10.42.0.0/16" }}`, Data: map[string]any{"V": "10.51.0.1"}, ExpectedOutput: "false"},
+		{Name: "IPv6Contains", Input: `{{ .V | cidrContains "2001:db8::/32" }}`, Data: map[string]any{"V": "2001:db8::1"}, ExpectedOutput: "true"},
+		{Name: "IPv6NotContains", Input: `{{ .V | cidrContains "2001:db8::/32" }}`, Data: map[string]any{"V": "2001:db9::1"}, ExpectedOutput: "false"},
+		{Name: "InvalidCIDR", Input: `{{ .V | cidrContains "invalid" }}`, Data: map[string]any{"V": "10.42.0.1"}, ExpectedErr: "invalid CIDR address"},
+		{Name: "InvalidIP", Input: `{{ .V | cidrContains "10.42.0.0/16" }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid IP address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestCIDRSize(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "CIDRSizeIPv4", Input: `{{ .V | cidrSize }}`, Data: map[string]any{"V": "10.42.0.0/16"}, ExpectedOutput: "65536"},
+		{Name: "CIDRSizeIPv6", Input: `{{ .V | cidrSize }}`, Data: map[string]any{"V": "2001:db8::/32"}, ExpectedOutput: "79228162514264337593543950336"},
+		{Name: "InvalidCIDR", Input: `{{ .V | cidrSize }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid CIDR address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestCIDRRangeList(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "CIDRRangeListIPv4", Input: `{{ .V | cidrRangeList | len }}`, Data: map[string]any{"V": "10.42.1.1/16"}, ExpectedOutput: "65536"},
+		{Name: "CIDRRangeListIPv4WithOne", Input: `{{ .V | cidrRangeList | len }}`, Data: map[string]any{"V": "10.42.1.1/32"}, ExpectedOutput: "1"},
+		{Name: "CIDRRangeListIPv6", Input: `{{ .V | cidrRangeList | len }}`, Data: map[string]any{"V": "2001:db8::1/120"}, ExpectedOutput: "256"},
+		{Name: "InvalidCIDR", Input: `{{ .V | cidrRangeList }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid CIDR address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestCIDRFirstIP(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "CIDRFirstIPv4", Input: `{{ .V | cidrFirst }}`, Data: map[string]any{"V": "10.42.0.0/24"}, ExpectedOutput: "10.42.0.0"},
+		{Name: "CIDRFirstIPv6", Input: `{{ .V | cidrFirst }}`, Data: map[string]any{"V": "2001:db8::/120"}, ExpectedOutput: "2001:db8::"},
+		{Name: "InvalidCIDR", Input: `{{ .V | cidrFirst }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid CIDR address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestCIDRLastIP(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "CIDRLastIPv4", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "10.42.0.0/24"}, ExpectedOutput: "10.42.0.255"},
+		{Name: "CIDRLastIPv4WithOne", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "10.42.0.0/32"}, ExpectedOutput: "10.42.0.0"},
+		{Name: "CIDRLastIPv4Max", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "10.42.0.0/0"}, ExpectedOutput: "255.255.255.255"},
+		{Name: "CIDRLastIPv6", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "2001:db8::/120"}, ExpectedOutput: "2001:db8::ff"},
+		{Name: "CIDRLastIPv6WithOne", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "2001:db8::/128"}, ExpectedOutput: "2001:db8::"},
+		{Name: "CIDRLastIPv6Max", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "2001:db8::/0"}, ExpectedOutput: "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"},
+		{Name: "InvalidCIDR", Input: `{{ .V | cidrLast }}`, Data: map[string]any{"V": "invalid"}, ExpectedErr: "invalid CIDR address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
+
+func TestCIDROverlap(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Name: "CIDROverlapIPv4Subset", Input: `{{ cidrOverlap "10.42.0.0/24" "10.42.0.0/16" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv4NoOverlapDifferentRange", Input: `{{ cidrOverlap "192.168.1.0/24" "10.0.0.0/8" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv4PartialOverlap", Input: `{{ cidrOverlap "10.0.1.0/24" "10.0.0.0/16" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv4AdjacentRanges", Input: `{{ cidrOverlap "192.168.1.0/24" "192.168.2.0/24" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv4SameRange", Input: `{{ cidrOverlap "192.168.1.0/24" "192.168.1.0/24" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv4SubsetSmall", Input: `{{ cidrOverlap "10.10.0.0/30" "10.10.0.0/16" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv4DifferentNonOverlapping", Input: `{{ cidrOverlap "172.16.0.0/24" "192.168.0.0/24" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv4OverlapInLargeRange", Input: `{{ cidrOverlap "172.16.10.0/24" "172.16.0.0/12" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv4SubsetInSmallerRange", Input: `{{ cidrOverlap "192.168.1.128/25" "192.168.1.0/24" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv4NoOverlapEdgeCases", Input: `{{ cidrOverlap "10.255.255.0/24" "11.0.0.0/8" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv6Subset", Input: `{{ cidrOverlap "2001:db8::/64" "2001:db8::/32" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv6NoOverlapDifferentRange", Input: `{{ cidrOverlap "2001:db8::/64" "3001:db8::/32" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv6PartialOverlap", Input: `{{ cidrOverlap "2001:db8:1234::/64" "2001:db8::/32" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv6AdjacentRanges", Input: `{{ cidrOverlap "2001:db8:abcd::/64" "2001:db8:abce::/64" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv6SameRange", Input: `{{ cidrOverlap "2001:db8::/48" "2001:db8::/48" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv6SmallSubset", Input: `{{ cidrOverlap "2001:db8:abcd::/126" "2001:db8:abcd::/64" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv6DifferentNonOverlapping", Input: `{{ cidrOverlap "fe80::/10" "2001:db8::/32" }}`, ExpectedOutput: "false"},
+		{Name: "CIDROverlapIPv6OverlapInLargeRange", Input: `{{ cidrOverlap "2001:db8:ffff::/48" "2001:db8::/32" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv6SubsetInSmallerRange", Input: `{{ cidrOverlap "2001:db8:abcd::/64" "2001:db8::/32" }}`, ExpectedOutput: "true"},
+		{Name: "CIDROverlapIPv6NoOverlapEdgeCases", Input: `{{ cidrOverlap "2001:db8:ffff::/64" "2001:db9::/32" }}`, ExpectedOutput: "false"},
+		{Name: "InvalidCIDRA", Input: `{{ cidrOverlap "invalid" "10.42.0.0/32" }}`, ExpectedErr: "invalid CIDR address"},
+		{Name: "InvalidCIDRB", Input: `{{ cidrOverlap "10.42.0.0/32" "invalid" }}`, ExpectedErr: "invalid CIDR address"},
+	}
+
+	pesticide.RunTestCases(t, network.NewRegistry(), tc)
+}
diff --git a/registry/network/helpers_test.go b/registry/network/helpers_test.go
new file mode 100644
index 0000000..568ec55
--- /dev/null
+++ b/registry/network/helpers_test.go
@@ -0,0 +1,49 @@
+package network
+
+import (
+	"net"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+// TestDetermineIPVersion tests the determineIPVersion function.
+func TestDetermineIPVersion(t *testing.T) {
+	nr := &NetworkRegistry{}
+
+	// Test case: IPv4 address
+	ipv4 := net.ParseIP("192.168.0.1")
+	assert.Equal(t, uint8(4), nr.determineIPVersion(ipv4))
+
+	// Test case: IPv6 address
+	ipv6 := net.ParseIP("2001:db8::1")
+	assert.Equal(t, uint8(6), nr.determineIPVersion(ipv6))
+
+	// Test case: IPv4-mapped IPv6 address
+	ipv4MappedIPv6 := net.ParseIP("::ffff:192.168.0.1")
+	assert.Equal(t, uint8(4), nr.determineIPVersion(ipv4MappedIPv6))
+}
+
+// TestCalculateLastIP tests the calculateLastIP function.
+func TestCalculateLastIP(t *testing.T) {
+	nr := &NetworkRegistry{}
+
+	// Test case: IPv4 CIDR
+	_, cidrIPv4, err := net.ParseCIDR("192.168.0.0/24")
+	require.NoError(t, err)
+	expectedIPv4 := net.ParseIP("192.168.0.255").To4() // Use To4() to ensure it's in 4-byte format
+	assert.Equal(t, expectedIPv4, nr.calculateLastIP(cidrIPv4).To4())
+
+	// Test case: IPv6 CIDR
+	_, cidrIPv6, err := net.ParseCIDR("2001:db8::/64")
+	require.NoError(t, err)
+	expectedIPv6 := net.ParseIP("2001:db8::ffff:ffff:ffff:ffff")
+	assert.Equal(t, expectedIPv6, nr.calculateLastIP(cidrIPv6))
+
+	// Test case: Smaller IPv4 CIDR block
+	_, cidrIPv4Small, err := net.ParseCIDR("192.168.1.0/30")
+	require.NoError(t, err)
+	expectedIPv4Small := net.ParseIP("192.168.1.3").To4() // Use To4() to ensure it's in 4-byte format
+	assert.Equal(t, expectedIPv4Small, nr.calculateLastIP(cidrIPv4Small).To4())
+}