From 018482e36fdb34f41b720b61a41ffa2451b28df8 Mon Sep 17 00:00:00 2001 From: Zhennan Zhou Date: Wed, 15 May 2024 00:09:59 -0700 Subject: [PATCH] add more readme and a simple demo --- Makefile | 5 ++- Package.swift | 7 ++++- README.md | 66 ++++++++++++++++++++++++++++++++++++++-- Sources/Demo/README.md | 9 ++++++ Sources/Demo/main.swift | 39 ++++++++++++++++++++++++ images/logo.png | Bin 0 -> 18236 bytes 6 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 Sources/Demo/README.md create mode 100644 Sources/Demo/main.swift create mode 100644 images/logo.png diff --git a/Makefile b/Makefile index d9cb130..7bfd8d8 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,10 @@ debug_integration_test: make setup_server swift test -Xswiftc -DINTEGRATION_TEST -Xswiftc -DDEBUG --filter IntegrationTests make teardown_server - + +.PHONY: demo +demo: + swift run Demo .PHONY: clean clean: diff --git a/Package.swift b/Package.swift index 3f477fc..35c7c43 100644 --- a/Package.swift +++ b/Package.swift @@ -12,7 +12,7 @@ let package = Package( // Products define the executables and libraries a package produces, and make them visible to other packages. .library( name: "LCLPing", - targets: ["LCLPing"]), + targets: ["LCLPing"]) ], dependencies: [ // Dependencies declare other packages that this package depends on. @@ -36,6 +36,11 @@ let package = Package( .product(name: "NIOSSL", package: "swift-nio-ssl"), .product(name: "Collections", package: "swift-collections") ]), + .executableTarget( + name: "Demo", + dependencies: ["LCLPing"], + exclude: ["README.md"] + ), .testTarget( name: "UtilitiesTests", dependencies: ["LCLPing"] diff --git a/README.md b/README.md index 89de0bf..39f6967 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,75 @@ -![Swift CI](https://github.com/Local-Connectivity-Lab/lcl-ping/actions/workflows/build.yaml/badge.svg?branch=main) +

+ Logo=5.9) +import Foundation +import LCLPing + +// create ping configuration for each run +let pingConfig = LCLPing.PingConfiguration(type: .icmp, endpoint: .ipv4("google.com", 0)) + +// create ping options +#if os(macOS) || os(iOS) +let options = LCLPing.Options(verbose: false, useNative: false) +#else +let options = LCLPing.Options(verbose: false) +#endif + +// initialize ping object with the options +var ping = LCLPing(options: options) + +try await ping.start(pingConfiguration: pingConfig) +switch ping.status { +case .error, .ready, .running: + print("LCLPing is in invalid state. Abort") +case .stopped, .finished: + print(ping.summary) +} +#else +fatalError("Requires at least Swift 5.9") +#endif diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..00218f8b0e11dcf496362c8f0c4042a3615a143d GIT binary patch literal 18236 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 literal 0 HcmV?d00001