From 036d12e2296b615c5b9c116bd0680da03d40684b Mon Sep 17 00:00:00 2001 From: Danilo Lutz Date: Mon, 24 Nov 2025 18:01:27 -0300 Subject: [PATCH] docs: add documentations --- .github/workflows/publish-docs.yml | 42 ++ .gitignore | 3 + CoreZipCode/Interfaces/PostCodeBaseService.cs | 3 - CoreZipCode/Interfaces/ZipCodeBaseService.cs | 3 - .../PostalpincodeInApi/PostalpincodeIn.cs | 7 + .../PostalpincodeInModel.cs | 15 + .../Postcode/PostcodesIoApi/PostcodesIo.cs | 7 + .../PostcodesIoApi/PostcodesIoModel.cs | 23 + .../Services/ZipCode/SmartyApi/Smarty.cs | 8 + .../ZipCode/SmartyApi/SmartyException.cs | 6 + .../Services/ZipCode/SmartyApi/SmartyModel.cs | 20 + .../ZipCode/SmartyApi/SmartyParamsModel.cs | 30 ++ .../Services/ZipCode/ViaCepApi/ViaCep.cs | 7 + .../ZipCode/ViaCepApi/ViaCepAddressModel.cs | 7 + .../ZipCode/ViaCepApi/ViaCepException.cs | 6 + README.md | 4 +- corezipcode.svg | 1 - docs/docfx.json | 60 +++ docs/docs/extending-corezipcode.md | 27 + docs/docs/introduction.md | 23 + docs/docs/toc.yml | 6 + .../images/corezipcode.png | Bin docs/images/corezipcode.svg | 121 +++++ .../images/corezipcode128.png | Bin docs/images/favicon.ico | Bin 0 -> 15406 bytes docs/images/flow.excalidraw | 482 ++++++++++++++++++ docs/images/flow.png | Bin 0 -> 25864 bytes docs/images/flow.svg | 4 + docs/images/pin.png | Bin 0 -> 3078 bytes docs/images/pin.svg | 51 ++ docs/index.md | 53 ++ docs/template/public/main.css | 4 + docs/template/public/main.js | 9 + docs/toc.yml | 4 + 34 files changed, 1027 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/publish-docs.yml delete mode 100644 corezipcode.svg create mode 100644 docs/docfx.json create mode 100644 docs/docs/extending-corezipcode.md create mode 100644 docs/docs/introduction.md create mode 100644 docs/docs/toc.yml rename corezipcode.png => docs/images/corezipcode.png (100%) create mode 100644 docs/images/corezipcode.svg rename corezipcode128.png => docs/images/corezipcode128.png (100%) create mode 100644 docs/images/favicon.ico create mode 100644 docs/images/flow.excalidraw create mode 100644 docs/images/flow.png create mode 100644 docs/images/flow.svg create mode 100644 docs/images/pin.png create mode 100644 docs/images/pin.svg create mode 100644 docs/index.md create mode 100644 docs/template/public/main.css create mode 100644 docs/template/public/main.js create mode 100644 docs/toc.yml diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 0000000..3571619 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,42 @@ +on: + push: + tags: + - "*" + +permissions: + actions: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + publish-docs: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Dotnet Setup + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 8.x + + - run: dotnet tool update -g docfx + - run: docfx docs/docfx.json + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: 'docs/_site' + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2c3317d..a116414 100644 --- a/.gitignore +++ b/.gitignore @@ -555,3 +555,6 @@ coverage.json coverage.cobertura.xml # End of https://www.gitignore.io/api/aspnetcore,visualstudio,visualstudiocode,openframeworks+visualstudio + +docs/_site +docs/api \ No newline at end of file diff --git a/CoreZipCode/Interfaces/PostCodeBaseService.cs b/CoreZipCode/Interfaces/PostCodeBaseService.cs index 844a246..ca5af9c 100644 --- a/CoreZipCode/Interfaces/PostCodeBaseService.cs +++ b/CoreZipCode/Interfaces/PostCodeBaseService.cs @@ -4,19 +4,16 @@ namespace CoreZipCode.Interfaces { - /// /// /// Postcode base service abstract class. /// public abstract class PostcodeBaseService : ApiHandler { - /// /// /// postalcode base service protected constructor. /// protected PostcodeBaseService() { } - /// /// /// postalcode base service protected constructor. /// diff --git a/CoreZipCode/Interfaces/ZipCodeBaseService.cs b/CoreZipCode/Interfaces/ZipCodeBaseService.cs index 94cad39..7624f49 100644 --- a/CoreZipCode/Interfaces/ZipCodeBaseService.cs +++ b/CoreZipCode/Interfaces/ZipCodeBaseService.cs @@ -5,19 +5,16 @@ namespace CoreZipCode.Interfaces { - /// /// /// Zip code base service abstract class /// public abstract class ZipCodeBaseService : ApiHandler { - /// /// /// Zip Code Base Service protected constructor. /// protected ZipCodeBaseService() { } - /// /// /// Zip Code Base Service protected constructor. /// diff --git a/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeIn.cs b/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeIn.cs index 58153a9..5796c79 100644 --- a/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeIn.cs +++ b/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeIn.cs @@ -3,6 +3,13 @@ namespace CoreZipCode.Services.Postcode.PostalpincodeInApi { + /// + /// Provides access to the Postalpincode.in API for retrieving postal code information. + /// + /// This class extends to implement API-specific behavior for + /// Postalpincode.in. Use this class to construct requests and obtain data related to Indian postal pincodes. + /// Instances can be initialized with an to customize HTTP request handling. + /// For more information about the Postal Pin Code API, see http://www.postalpincode.in/. public class PostalpincodeIn : PostcodeBaseService { public PostalpincodeIn() { } diff --git a/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeInModel.cs b/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeInModel.cs index 3787736..7a30d31 100644 --- a/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeInModel.cs +++ b/CoreZipCode/Services/Postcode/PostalpincodeInApi/PostalpincodeInModel.cs @@ -4,6 +4,13 @@ namespace CoreZipCode.Services.Postcode.PostalpincodeInApi { + /// + /// Represents the response model for postal pincode queries, containing status information, a message, and a + /// collection of post office details. + /// + /// This class is typically used to deserialize responses from postal pincode APIs. The + /// properties correspond to the expected fields in the API response, allowing access to the status, message, and + /// associated post office data. [Serializable] public class PostalpincodeInModel { @@ -17,6 +24,14 @@ public class PostalpincodeInModel public List PostOffice { get; set; } } + /// + /// Represents a postal office location and its associated details, including name, branch type, delivery status, + /// and geographic information. + /// + /// This class is typically used to model information about a post office for address validation, + /// postal lookup, or geographic categorization scenarios. All properties are read-write and correspond to standard + /// attributes found in postal systems. Instances of this class can be serialized for data exchange or storage + /// purposes. [Serializable] public class PostOffice { diff --git a/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIo.cs b/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIo.cs index a4cc671..2f687af 100644 --- a/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIo.cs +++ b/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIo.cs @@ -3,6 +3,13 @@ namespace CoreZipCode.Services.Postcode.PostcodesIoApi { + /// + /// Provides access to postcode lookup services using the Postcodes.io API. + /// + /// This class extends . Use this class to construct requests for postcode + /// information via the postcodes.io endpoint. Inherit from this class to extend or customize postcode-related operations. + /// This class is intended for use with UK postcodes and relies on an HTTP client for making API requests. For more + /// information about the Postcodes API, see https://postcodes.io. public class PostcodesIo : PostcodeBaseService { public PostcodesIo() { } diff --git a/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIoModel.cs b/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIoModel.cs index 1f475d2..d7fbf8b 100644 --- a/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIoModel.cs +++ b/CoreZipCode/Services/Postcode/PostcodesIoApi/PostcodesIoModel.cs @@ -4,6 +4,12 @@ namespace CoreZipCode.Services.Postcode.PostcodesIoApi { + /// + /// Represents the response model for the Postcodes.io API, containing the status code and a collection of postcode + /// results. + /// + /// This class is typically used to deserialize JSON responses from the Postcodes.io service. The + /// structure matches the standard response format returned by the API for postcode queries. [Serializable] public class PostcodesIoModel { @@ -14,6 +20,15 @@ public class PostcodesIoModel public List Result { get; set; } } + /// + /// Represents detailed information about a UK postcode, including geographic, administrative, and electoral data as + /// returned by postcode lookup services. + /// + /// This class provides structured access to various attributes associated with a postcode, such + /// as location coordinates, administrative regions, and health authorities. It is typically used to deserialize + /// responses from postcode APIs and may contain null or default values for properties where data is unavailable. + /// Thread safety is not guaranteed; if multiple threads access an instance concurrently, external synchronization + /// is required. [Serializable] public class Result { @@ -90,6 +105,14 @@ public class Result public Codes Codes { get; set; } } + /// + /// Represents a collection of administrative and geographic codes associated with a location, such as district, + /// county, ward, parish, and constituency identifiers. + /// + /// This class is typically used to provide standardized codes for various administrative + /// divisions in the United Kingdom. The codes correspond to specific government or statistical regions and can be + /// used for data integration, analysis, or mapping purposes. All properties are optional and may be null if the + /// corresponding code is not available. [Serializable] public class Codes { diff --git a/CoreZipCode/Services/ZipCode/SmartyApi/Smarty.cs b/CoreZipCode/Services/ZipCode/SmartyApi/Smarty.cs index 822b1d1..9d98785 100644 --- a/CoreZipCode/Services/ZipCode/SmartyApi/Smarty.cs +++ b/CoreZipCode/Services/ZipCode/SmartyApi/Smarty.cs @@ -5,6 +5,14 @@ namespace CoreZipCode.Services.ZipCode.SmartyApi { + /// + /// Provides access to Smarty ZIP code and street address lookup services using authenticated API requests. + /// + /// Use this class to construct authenticated requests to the Smarty US ZIP code and + /// street address APIs. The class requires valid authentication credentials, which are used to authorize each + /// request. Inherit from to enable integration with other ZIP code service implementations. This + /// class is not thread-safe; create a separate instance for each concurrent operation if needed. For more information about the Smarty API, see + /// https://www.smarty.com/. public class Smarty : ZipCodeBaseService { private const string ZipCodeSizeErrorMessage = "Invalid ZipCode Size"; diff --git a/CoreZipCode/Services/ZipCode/SmartyApi/SmartyException.cs b/CoreZipCode/Services/ZipCode/SmartyApi/SmartyException.cs index dbc5fe5..357fd8d 100644 --- a/CoreZipCode/Services/ZipCode/SmartyApi/SmartyException.cs +++ b/CoreZipCode/Services/ZipCode/SmartyApi/SmartyException.cs @@ -2,6 +2,12 @@ namespace CoreZipCode.Services.ZipCode.SmartyApi { + /// + /// Represents errors that occur during Smarty operations. + /// + /// Use this exception to indicate failures specific to Smarty functionality. This exception is + /// typically thrown when an operation cannot be completed due to invalid input, configuration issues, or other + /// conditions unique to Smarty. For general exceptions, use the base class. public class SmartyException : Exception { public SmartyException(string message) : base(message) diff --git a/CoreZipCode/Services/ZipCode/SmartyApi/SmartyModel.cs b/CoreZipCode/Services/ZipCode/SmartyApi/SmartyModel.cs index 5279fb5..4cbdcfb 100644 --- a/CoreZipCode/Services/ZipCode/SmartyApi/SmartyModel.cs +++ b/CoreZipCode/Services/ZipCode/SmartyApi/SmartyModel.cs @@ -4,6 +4,13 @@ namespace CoreZipCode.Services.ZipCode.SmartyApi { + /// + /// Represents the result of a Smarty address lookup, including input index and associated city-state and ZIP code + /// data. + /// + /// This model is typically used to deserialize responses from Smarty APIs. It contains + /// collections of city-state and ZIP code information corresponding to the input address. The class is serializable + /// and designed for use with JSON serialization frameworks. [Serializable] public class SmartyModel { @@ -17,6 +24,12 @@ public class SmartyModel public List Zipcodes { get; set; } } + /// + /// Represents a city and its associated state information, including mailing eligibility. + /// + /// This class is typically used to model address components for postal or location-based + /// operations. The properties provide both the full state name and its abbreviation, as well as an indicator of + /// whether the city is recognized for mailing purposes. public class CityState { [JsonProperty("city")] @@ -32,6 +45,13 @@ public class CityState public bool MailableCity { get; set; } } + /// + /// Represents a United States postal ZIP code and its associated geographic and administrative information. + /// + /// This class provides properties for common ZIP code attributes, including location + /// coordinates, city, county, and state details. It is typically used to model ZIP code data retrieved from + /// external sources or APIs. All properties are read-write and correspond to standard ZIP code metadata + /// fields. public class Zipcode { [JsonProperty("zipcode")] diff --git a/CoreZipCode/Services/ZipCode/SmartyApi/SmartyParamsModel.cs b/CoreZipCode/Services/ZipCode/SmartyApi/SmartyParamsModel.cs index 3ff74fe..edf3b8f 100644 --- a/CoreZipCode/Services/ZipCode/SmartyApi/SmartyParamsModel.cs +++ b/CoreZipCode/Services/ZipCode/SmartyApi/SmartyParamsModel.cs @@ -2,6 +2,12 @@ namespace CoreZipCode.Services.ZipCode.SmartyApi { + /// + /// Represents the address candidate parameters returned by the Smarty address validation API. + /// + /// This model contains detailed information about a validated address, including its components, + /// metadata, and analysis results. It is typically used to access parsed address fields and related data after a + /// Smarty address lookup operation. public class SmartyParamsModel { [JsonProperty("input_index")] @@ -29,6 +35,13 @@ public class SmartyParamsModel public Analysis Analysis { get; set; } } + /// + /// Represents the results of address analysis, including DPV (Delivery Point Validation) codes and related status + /// indicators. + /// + /// This class provides properties for various USPS DPV analysis codes and flags, which can be + /// used to interpret the deliverability and status of an address. The property values correspond to codes returned + /// by address validation services and may require reference to USPS documentation for detailed meaning. public class Analysis { [JsonProperty("dpv_match_code")] @@ -47,6 +60,14 @@ public class Analysis public string Active { get; set; } } + /// + /// Represents the individual address components for a United States postal address, including street, city, state, + /// and ZIP code information. + /// + /// This class provides structured properties for each part of an address, which can be used for + /// address parsing, validation, or formatting. All properties correspond to standard USPS address fields and are + /// mapped to their respective JSON keys for serialization and deserialization. Property values may be null or empty + /// if the corresponding address component is not available. public class Components { [JsonProperty("primary_number")] @@ -80,6 +101,15 @@ public class Components public string DeliveryPointCheckDigit { get; set; } } + /// + /// Represents supplemental metadata information for a geographic or postal record, including location, + /// administrative, and delivery details. + /// + /// The properties of this class provide access to various attributes such as record type, ZIP + /// code type, county information, carrier route, congressional district, residential delivery indicator (RDI), + /// enhanced line of travel (eLOT) data, geographic coordinates, time zone, and daylight saving time status. This + /// class is typically used to enrich address or location data with additional context for validation, analysis, or + /// delivery optimization scenarios. public class Metadata { [JsonProperty("record_type")] diff --git a/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCep.cs b/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCep.cs index f031d7f..c5610e1 100644 --- a/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCep.cs +++ b/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCep.cs @@ -4,6 +4,13 @@ namespace CoreZipCode.Services.ZipCode.ViaCepApi { + /// + /// Provides an implementation of a zip code lookup service using the ViaCep API for Brazilian addresses. + /// + /// ViaCep enables retrieval of address information based on zip code, state, city, and street + /// parameters. This class extends to construct ViaCep-specific request URLs. Use this service to + /// integrate Brazilian postal code queries into your application. For more information about the ViaCep API, see + /// https://viacep.com.br. public class ViaCep : ZipCodeBaseService { private const string ZipCodeSizeErrorMessage = "Invalid ZipCode Size"; diff --git a/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepAddressModel.cs b/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepAddressModel.cs index 0427a06..a2cd313 100644 --- a/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepAddressModel.cs +++ b/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepAddressModel.cs @@ -3,6 +3,13 @@ namespace CoreZipCode.Services.ZipCode.ViaCepApi { + /// + /// Represents an address as returned by the ViaCep API, including postal code, street information, and regional + /// identifiers. + /// + /// This model is typically used to deserialize address data from the ViaCep web service, which + /// provides postal code lookup for Brazilian addresses. All properties correspond to fields in the ViaCep API + /// response. This class is serializable and suitable for use in data transfer scenarios. [Serializable] public class ViaCepAddressModel { diff --git a/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepException.cs b/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepException.cs index 9c7133c..354c927 100644 --- a/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepException.cs +++ b/CoreZipCode/Services/ZipCode/ViaCepApi/ViaCepException.cs @@ -2,6 +2,12 @@ namespace CoreZipCode.Services.ZipCode.ViaCepApi { + /// + /// Represents errors that occur when interacting with the ViaCep API. + /// + /// Use this exception to identify and handle failures specific to ViaCep operations, such as + /// invalid responses or connectivity issues. This exception is typically thrown when the ViaCep service returns an + /// error or cannot be reached. For general exceptions, use the base class. public class ViaCepException : Exception { public ViaCepException(string message) : base(message) diff --git a/README.md b/README.md index e2e0571..5afe5ab 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![CoreZipCode](./corezipcode.png) +# ![CoreZipCode](./docs/images/corezipcode.png) [![Build](https://github.com/danilolutz/CoreZipCode/actions/workflows/main.yml/badge.svg)](https://github.com/danilolutz/CoreZipCode/actions/workflows/main.yml) [![Coverage Status](https://coveralls.io/repos/github/danilolutz/CoreZipCode/badge.svg?branch=master)](https://coveralls.io/github/danilolutz/CoreZipCode?branch=master) @@ -10,7 +10,7 @@ Normaly we must implement ZipCode or Postcode services every time in each new software we create. Well this package is for keep you [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) and eliminate the necessity to implement ZipCode or Postcode services over and over. -Also this package could be used for easily implements address services to yours [Microsoft .Net Core](https://dotnet.github.io/) based software. +Also this package could be used for easily implements address services to yours [Microsoft .NET](https://dotnet.github.io/) based software. And the **CoreZipCode** was designed to be easily extensible, and if you want, implement your own address services, you only must override the API calls methods. diff --git a/corezipcode.svg b/corezipcode.svg deleted file mode 100644 index d9d4fa4..0000000 --- a/corezipcode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/docfx.json b/docs/docfx.json new file mode 100644 index 0000000..e040e2b --- /dev/null +++ b/docs/docfx.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json", + "metadata": [ + { + "src": [ + { + "src": "../CoreZipCode", + "files": [ + "**/*.csproj" + ], + "exclude": [ "**/bin/**", "**/obj/**" ] + } + ], + "output": "api", + "outputFormat": "apiPage" + } + ], + "build": { + "content": [ + { + "files": [ + "**/*.{md,yml}" + ], + "exclude": [ + "_site/**" + ] + } + ], + "resource": [ + { + "files": [ + "images/**" + ] + } + ], + "output": "_site", + "template": [ + "default", + "modern", + "template" + ], + "globalMetadata": { + "_appName": "", + "_appTitle": "CoreZipCode", + "_appFooter": "CoreZipCode Docs", + "_appLogoPath": "images/corezipcode128.png", + "_appFaviconPath": "images/favicon.ico", + "_enableSearch": true, + "_gitContribute": { + "repo": "https://github.com/danilolutz/CoreZipCode" + }, + "pdf": false + }, + "sitemap": { + "baseUrl": "https://danilolutz.dev/CoreZipCode", + "priority": 0.5, + "changefreq": "daily" + } + } +} \ No newline at end of file diff --git a/docs/docs/extending-corezipcode.md b/docs/docs/extending-corezipcode.md new file mode 100644 index 0000000..873f30f --- /dev/null +++ b/docs/docs/extending-corezipcode.md @@ -0,0 +1,27 @@ +# Extending CoreZipCode + +You can extends `ZipCodeBaseService` abstract class and create your own implementation of your prefered address service. Like below: + +```CSharp +using CoreZipCode.Interfaces; + +namespace CoreZipCode.Services.YourService +{ + public class YourService : ZipCodeBaseService + { + public override string SetZipCodeUrl(string zipcode) + { + // You can implement some validation method here. + return $"https://yourservice.com/{zipcode}/json/"; + } + + public override string SetZipCodeUrlBy(string state, string city, string street) + { + // You can implement some validation method here. + return $"https://yourservice.com/{state}/{city}/{street}/json/"; + } + } +} +``` + +> **NOTE**: Same principles are used to extends postcode lookups (`PostCodeBaseService`). \ No newline at end of file diff --git a/docs/docs/introduction.md b/docs/docs/introduction.md new file mode 100644 index 0000000..85ce473 --- /dev/null +++ b/docs/docs/introduction.md @@ -0,0 +1,23 @@ +# Introduction + +Normaly we must implement ZipCode or Postcode services every time in each new software we create. Well this package is for keep you [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) and eliminate the necessity to implement ZipCode or Postcode services over and over. + +Also this package could be used for easily implements address services to yours [Microsoft .NET](https://dotnet.github.io/) based software. + +And the **CoreZipCode** was designed to be easily extensible, and if you want, implement your own address services, you only must override the API calls methods. + +## Concept and flow + +- `*BaseService` are classes with reusable predefined methods. +- `ApiHandler` is a `HttpClient` adapter witch is consumed by `*BaseService` classes. + +A step-by-step guide: + +1. `CustomZipCodeService` extends `ZipCodeBaseService` and define how API URLs must be treated via abstract methods. +2. `ZipCodeBaseService` builds the URL and execute some validations (or not, it's up to you). +3. `ZipCodeBaseService` calls `ApiHandler`, witch do a request to external desired API and do some response validations. + +Nothing like a diagram to simplify the explanation: + +![CoreZipCode flow](../images/flow.svg) + diff --git a/docs/docs/toc.yml b/docs/docs/toc.yml new file mode 100644 index 0000000..d5685c7 --- /dev/null +++ b/docs/docs/toc.yml @@ -0,0 +1,6 @@ +- name: Get started +- href: ../index.md +- href: introduction.md + +- name: Extending +- href: extending-corezipcode.md \ No newline at end of file diff --git a/corezipcode.png b/docs/images/corezipcode.png similarity index 100% rename from corezipcode.png rename to docs/images/corezipcode.png diff --git a/docs/images/corezipcode.svg b/docs/images/corezipcode.svg new file mode 100644 index 0000000..15b1ad0 --- /dev/null +++ b/docs/images/corezipcode.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/corezipcode128.png b/docs/images/corezipcode128.png similarity index 100% rename from corezipcode128.png rename to docs/images/corezipcode128.png diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b5cb8ef7e0d2497d65531d26c76353fc309ec972 GIT binary patch literal 15406 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 mcpxqMT#tl=go + +CustomZipCodeServiceZipCodeBaseServiceApiHandlerExternal DesiredAPI \ No newline at end of file diff --git a/docs/images/pin.png b/docs/images/pin.png new file mode 100644 index 0000000000000000000000000000000000000000..6e3bf71525042b914df1e828d7a6efc5939b9c5b GIT binary patch literal 3078 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 UktALG{r~^~07*qoM6N<$f?56Mga7~l literal 0 HcmV?d00001 diff --git a/docs/images/pin.svg b/docs/images/pin.svg new file mode 100644 index 0000000..21684b2 --- /dev/null +++ b/docs/images/pin.svg @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..c99e306 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,53 @@ +# Quick Start + +You can download the code and build it by yourself or you can install by [Nuget](https://www.nuget.org) package in: [CoreZipCode Package](https://www.nuget.org/packages/CoreZipCode/). + +Just in case if you doesn't want leave GitHub at this moment: + +```bash +dotnet add package CoreZipCode +``` + +## Quickest example + +After you decide how you'll get the CoreZipCode, just inject (e.g.: [Simple Injector](https://simpleinjector.org/)) and use it. + +```CSharp +using CoreZipCode.Interfaces; + +namespace YourProject +{ + public YourClass + { + private readonly ZipCodeBaseService _coreZipCode; + + public YourClass(ZipCodeBaseService coreZipCode) + { + _coreZipCode = coreZipCode; + } + + public void YourMethod() + { + var addressByZipCode = _coreZipCode.Execute("14810100"); + var zipCodeByAddress = _coreZipCode.Execute("sp", "araraquara", "barão do rio"); + + // Generic type return was added in version 1.1.0 + var addressByZipCodeObject = _coreZipCode.GetAddress("14810100"); + var zipCodeByAddressObjectList = _coreZipCode.ListAddresses("sp", "araraquara", "barão do rio"); + } + + // Async methods introduced in 1.1.0 + public async void YourMethodAsync() + { + var addressByZipCode = await _coreZipCode.ExecuteAsync("14810100"); + var zipCodeByAddress = await _coreZipCode.ExecuteAsync("sp", "araraquara", "barão do rio"); + + // Generic type return. + var addressByZipCodeObject = await _coreZipCode.GetAddressAsync("14810100"); + var zipCodeByAddressObjectList = await _coreZipCode.ListAddressesAsync("sp", "araraquara", "barão do rio"); + } + } +} +``` + +You can check [Program.cs](https://github.com/danilolutz/CoreZipCode/blob/main/SampleApp/Program.cs) to more robust example. diff --git a/docs/template/public/main.css b/docs/template/public/main.css new file mode 100644 index 0000000..e0eb485 --- /dev/null +++ b/docs/template/public/main.css @@ -0,0 +1,4 @@ +body { + --bs-link-color-rgb: 66, 184, 131 !important; + --bs-link-hover-color-rgb: 64, 180, 128 !important; +} \ No newline at end of file diff --git a/docs/template/public/main.js b/docs/template/public/main.js new file mode 100644 index 0000000..7170361 --- /dev/null +++ b/docs/template/public/main.js @@ -0,0 +1,9 @@ +export default { + iconLinks: [ + { + icon: 'github', + href: 'https://github.com/danilolutz/CoreZipCode', + title: 'GitHub' + } + ] +} \ No newline at end of file diff --git a/docs/toc.yml b/docs/toc.yml new file mode 100644 index 0000000..061acc6 --- /dev/null +++ b/docs/toc.yml @@ -0,0 +1,4 @@ +- name: Docs + href: docs/ +- name: API + href: api/ \ No newline at end of file