Skip to content

Instantly share code, notes, and snippets.

@PtrMan
Last active May 9, 2023 10:59
Show Gist options
  • Save PtrMan/05d451d1026494260d6332c4d45cf55e to your computer and use it in GitHub Desktop.
Save PtrMan/05d451d1026494260d6332c4d45cf55e to your computer and use it in GitHub Desktop.

collection of minimal Nim programs to accomplish simple tasks

keywords: Nim keywords: code snippets

import md5
echo "Hello, world!".md5().toHex()
import std/strformat
let payloadTxt: string = "TEST"
var json0 = &"{{\"type\":\"cmd\",\"payload\":\"{payloadTxt}\"}}"
echo json0
# compile with --threads:on
import std/os # for sleep
var
# create a channel to send/recv strings
commChan: Channel[string]
sender: Thread[void]
recver: Thread[void]
proc sendMsg() =
sleep(500)
# send a message in the channel
commChan.send("Hi")
proc recvMsg() =
# block on the channel, waiting for output
let msg: string = commChan.recv()
echo "Received message: " & msg
# very important: channels must be opened before they can be used
commChan.open()
createThread(sender, sendMsg)
createThread(recver, recvMsg)
joinThreads(sender, recver)
import std/net
let socket = newSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
#socket.setBlocking(false)
var address: string = "0.0.0.0"
var port: int = 26098
socket.sendTo(address, Port(port), "status\n")
while true:
var data: string
let length: int = 2048
var port2: Port
let recvRes: int = recvFrom(socket, data, length, address, port2)
# from https://nim-lang.org/docs/asyncnet.html
import std/[asyncnet, asyncdispatch]
var clients {.threadvar.}: seq[AsyncSocket]
proc processClient(client: AsyncSocket) {.async.} =
while true:
let line = await client.recvLine()
if line.len == 0: break
for c in clients:
await c.send(line & "\c\L")
proc serve() {.async.} =
clients = @[]
var server = newAsyncSocket()
server.setSockOpt(OptReuseAddr, true)
server.bindAddr(Port(12345))
server.listen()
while true:
let client = await server.accept()
clients.add client
asyncCheck processClient(client)
asyncCheck serve()
runForever()
import std/[asyncnet, asyncdispatch]
# Create the socket
var socket = newAsyncSocket()
block:
# Connect to the server
let host = "127.0.0.1"
let port: Port = Port(4466)
waitFor socket.connect(host, port)
echo "net: Connected to the server"
var recvFuture: Future[system.string] = socket.recvLine()
while true:
poll(25)
if recvFuture.finished:
echo "DBG: recvFuture finished"
if not recvFuture.failed:
let recvMsg: string = recvFuture.read
echo "net: recv=", recvMsg
recvFuture = socket.recvLine()
import std/[asyncnet, asyncdispatch]
proc asyncClient(host: string, port: Port, message: string) {.async.} =
# Create the socket
var socket = newAsyncSocket()
try:
# Connect to the server
await socket.connect(host, port)
echo "Connected to the server."
# Send the message to the server
await socket.send(message)
echo "Message sent: ", message
# Receive the response from the server
#var response = newString(1024)
#let bytesRead = await socket.recv(response, response.len)
#response.setLen(bytesRead)
var response: string = await socket.recvLine()
echo "Response received: ", response
except CatchableError as error:
echo "Error: ", error.msg
finally:
# Close the connection
socket.close()
echo "Connection closed."
# Main procedure
proc main() =
let host = "127.0.0.1"
let port: Port = Port(12345)
let message = "Hello, Server!"
waitFor asyncClient(host, port, message)
main()
import system/io
# Open a binary file for reading
let input = open("textZ9584.txt.gz", fmRead)
let content = input.readAll()
input.close()
# Do something with the content
echo(content)
# keywords: regex
# keywords: regular expression
# keywords: nim
# keywords: group matching
import re
let s = "22. YTTD kmkmkm"
let pattern = re"^\d+\. ([\w\s]+)$"
var matchesArr: array[2, string]
let matches = match(s, pattern, matchesArr)
if matches: # check if there is a match
echo("match found")
echo(matchesArr[0])
else:
echo("No match found")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment