Understanding vlang using node js examples
Vlang examples compared with NodeJs
Inspired by golang-for-nodejs-developers. Structure of the example is almost same as this repo.
- Comments
 - Logging
 - Variables
 - Types
 - Interpolation
 - If else
 - For Loop
 - While Loop
 - Switch
 - Arrays
 - Map
 - Object
 - Functions
 - Default Values
 - Destructure
 - Spread Operator
 - Rest Parameter
 - Swapping
 - Classes
 - Generators Need help 🙏
 - Date Time
 - Callback/Wait
 - Interval ToDo 🚧
 - IIFE
 - File handling
 - JSON
 - Promise
 - Try/Catch
 - Http Server
 - Modules
 - Package Management
 - Stdout
 - Stderr
 - Stdin
 - Custom Erros
 - URL Parse
 
buffers
streams
reading
writing
event emitter
regex
exec (sync)
exec (async)
tcp server
udp server
gzip 
dns 
crypto
sha256
env vars
cli args
cli flags
// single line comment
/**
 * multi line comments
 */// Single line comment.
/*
Multiline comment.
*/console.log('Print log to console') // Stdout
var randomString = 'some random sting';
var someInt = 1;
console.log('Format printing example %s %d', randomString , someInt)
console.error('Print some error message') // Stderr Print log to console
Format printing example some random sting 1
Print some error message
fn main(){
	random_string := 'some random string' 
	some_int := 1  
	println('Prints a message in v with new line')
	println('Format printing example $random_string $some_int')
	eprintln('Print error message')
}Prints a message in v with new line
Format printing example some random string 1 
Print error message
console.log((new Date()).toISOString(), '-', 'Log message')2022-08-14T02:27:36.509Z - Log message
import log
fn main() {
	mut l := log.Log{
		level: .info
		output_target: .console
	}
	l.info('info message')
}2022-08-14T05:30:40.117Z - info message
// function scoped
var x = 'Cat 🐈'
// block scoped
let y = 'Dog 🐕'
// constant
const z = 'Fox 🦊'mut y := 'Dog 🐕'
y = 'Monkey 🐒'
println(y)
x := 'Cat 🐈'
// You can not assign a value to `x` again
// x = '10'
println(x)Monkey 🐒
Cat 🐈
// 7 Primitive types
// string
const sampleString = 'Hello Tom'
console.log(typeof(sampleString))
// number
const count = 10
console.log(typeof(count))
// boolean
const isEnabled = false
console.log(typeof(isEnabled))
// null
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#typeof_null
const salary = null
console.log(typeof(salary)); // It is object
// undefined
const isMale = undefined
console.log(typeof(isMale));
// symbol
const mySymbol = Symbol()
console.log(typeof(mySymbol));
// bigint
const myBigInt = 123242343343n
console.log(typeof(myBigInt));string
number
boolean
object
undefined
symbol
bigint
// string
a := 'Sample string'
println(typeof(a).name)
//int 
b := 10
println(typeof(b).name)
//bool
c := true
println(typeof(c).name)
// No null, no undefined data types
// Couldn't find anything related to javascript`s Symbol
big_int := i64(9999999999)
println(typeof(big_int).name)
string
int
bool
i64
const os = 'Mac'
const version = 13
const message = `You are using ${os} version ${version}`
console.log(message)You are using Mac version 1
fn main() {
	os := 'Mac'
	version := 13
	println('You are using $os version $version')
}
You are using Mac version 13
function check_os(os) {
    if (os === 'mac') {
        console.log('Use homebrew')
    } else if (os === 'windows') {
        console.log('Use .exe')
    } else {
        console.log('Support only for mac and windows')
    }
}
check_os('mac')
check_os('Linux')
check_os('windows')Use homebrew
Support only for mac and windows
Use .exe
fn check_os(os string) {
	if os == 'mac' {
		println('Use homebrew')
	} else if os == 'windows' {
		println('Use .exe')
	} else {
		println('Support only for mac and windows')
	}
}
fn main() {
	check_os('mac')
	check_os('Linux')
	check_os('windows')
}
Use homebrew
Support only for mac and windows
Use .exe
const colors = ['Red', 'Black', 'Blue', 'White', 'Pink']
for (let i in colors) {
    console.log(colors[i]);
}
for (let i in colors) {
    console.log(`Index ${i} ${colors[i]}`);
}Red
Black
Blue
White
Pink
Index 0 Red
Index 1 Black
Index 2 Blue
Index 3 White
Index 4 Pink
fn main() {
	colors := ['Red', 'Black', 'Blue', 'White', 'Pink']
	for color in colors {
		println(color)
	}
	for i, color in colors {
		println('Index $i $color')
	}
}
Red
Black
Blue
White
Pink
Index 0 Red
Index 1 Black
Index 2 Blue
Index 3 White
Index 4 Pink
let sum = 0
let i = 0
while (i <= 10) {
    sum += i
    i++
}
console.log(sum);55
mut sum := 0
mut i := 0
for i <= 10 {
	sum += i
	i++
}
println(sum)55
const value = 'Green'
switch (value) {
    case 'Red':
        console.log('Stop')
        break
    case 'Yellow':
        console.log('Slowdown')
        break
    case 'Green':
        console.log('Go..')
        break
    default:
        console.log('Something wrong')
}Go..
signal := 'Green'
match signal {
	'Red' { println('Stop') }
	'Yellow' { println('Slowdown') }
	'Green' { println('Go..') }
	else { println('Something wrong') }
}
Go..
let colors = ['Red', 'Green', 'Yellow', 'Blue', 'Purple']
console.log(colors.length) // length of an array
console.log(colors[1]) // access element by index
colors.push('Orange') // append an element to an array
const colors_copy = [...colors] // copy of colors array. 
console.log(colors_copy)
console.log(colors.sort()) // Sort an array
console.log(colors.pop()); // removes last element(Yellow) of an array and returns it
console.log(colors.includes('Yellow')) // false5
Green
[ 'Red', 'Green', 'Yellow', 'Blue', 'Purple', 'Orange' ]
[ 'Blue', 'Green', 'Orange', 'Purple', 'Red', 'Yellow' ]
Yellow
false
fn main() {
	mut colors := ['Red', 'Green', 'Yellow', 'Blue', 'Purple']
	println(colors.len)
	println(colors[1])
	colors << 'Orange'
	colors_copy := colors.clone()
	println(colors_copy)
	colors.sort()
	println(colors)
	println(colors.pop())
	println('Yellow' in colors)
}
5
Green
['Red', 'Green', 'Yellow', 'Blue', 'Purple', 'Orange']
['Blue', 'Green', 'Orange', 'Purple', 'Red', 'Yellow']
Yellow
false
let colors = ['Red', 'Green', 'Yellow', 'Blue', 'Purple']
colors.forEach((color) => console.log(color))
let upper = colors.map((color) => color.toUpperCase())
console.log(upper);
let numbers =  [1, 2, 3, 4, 5, 6]
even_numbers = numbers.filter(value => value % 2 == 0)
console.log(even_numbers);
let sum = numbers.reduce(
    (previousValue, currentValue) => previousValue + currentValue, 0
  );
console.log(sum);Red
Green
Yellow
Blue
Purple
[ 'RED', 'GREEN', 'YELLOW', 'BLUE', 'PURPLE' ]
[ 2, 4, 6 ]
21
import arrays
fn main() {
	mut colors := ['Red', 'Green', 'Yellow', 'Blue', 'Purple']
	for color in colors {
		println(color)
	}
	upper := colors.map(fn (w string) string {
		return w.to_upper()
	})
	println(upper)
	numbers := [1, 2, 3, 4, 5, 6]
	even_numbers := numbers.filter(it % 2 == 0)
	println(even_numbers)
	m := arrays.reduce(numbers, fn (t1 int, t2 int) int {
		return t1 + t2
	})?
	println(m)
}Red
Green
Yellow
Blue
Purple
['RED', 'GREEN', 'YELLOW', 'BLUE', 'PURPLE']
[2, 4, 6]
21
const employee_details = new Map()
employee_details.set('name', 'John')
employee_details.set('gender', 'Male')
// Iterate map
for (let [key, value] of employee_details) {
    console.log(key, '->', value)
}
console.log(employee_details.has('gender'))
console.log(employee_details.get('gender'))
console.log(typeof (employee_details));
console.log(employee_details.get('bad_key'))
employee_details.delete('name')
console.log(employee_details);name -> John
gender -> Male
true
Male
object
undefined
Map { 'gender' => 'Male' }
mut employee_details := {
	'name':   'John'
	'gender': 'Male'
}
for key, value in employee_details {
	println('$key -> $value')
}
println('gender' in employee_details)
println(employee_details['gender'])
println(typeof(employee_details).name)
println('bad_key' in employee_details)
employee_details.delete('name')
println(employee_details)
name -> John
gender -> Male
true
Male
map[string]string
false
{'gender': 'Male'}
const employee = {
    name: {
        'firstname': 'Jack',
        'lastname': 'Dane'
    },
    fullname: function () {
        return `${this.name.firstname} ${this.name.lastname}`
    }
}
let fullname = employee.fullname()
console.log(employee.name.firstname);
console.log(fullname);Jack
Jack Dane
struct Name {
	firstname string
	lastname  string
}
struct Employee {
	Name
}
fn (name Name) fullname() string {
	return '$name.firstname $name.lastname'
}
mut a := Employee{
	firstname: 'Jack'
	lastname: 'Dane'
}
println(a.firstname)
println(a.fullname())
Jack
Jack Dane
const os = require('os')
// function with out arguments
function get_os() {
    return os.platform()
}
//  function with argument
function get_string_len(s) {
    return s.length
}
console.log(get_os())
console.log(get_string_len('Hello 🚀'))darwin
8
import os
// function with out arguments
fn get_os() string {
	return os.user_os()
}
//  function with argument
fn get_string_len(s string) int {
	return s.len
}
fn main() {
	println(get_os())
	println(get_string_len('Hello 🚀')) // Emoji holds 4
}macos
10
function get_order({
    food,
    size = 'Medium'
}) {
    return `${size} size ${food}`
}
order_1 = get_order({food: 'Pizza 🍕'})
order_2 = get_order({food: 'Beer 🍺', size: 'Large'})
console.log(order_1);
console.log(order_2);Medium size Pizza 🍕
Large size Beer 🍺
// Need to use struct to set default params
struct Options {
	food string
	size string = 'Medium'
}
fn get_order(opt Options) string {
	return '$opt.size size $opt.food'
}
fn main() {
	order_1 := get_order(Options{
		food: 'Pizza 🍕'
	})
	order_2 := get_order(Options{
		food: 'Beer 🍺'
		size: 'Large'
	})
	println(order_1)
	println(order_2)
}
Medium size Pizza 🍕
Large size Beer 🍺
let person = {
    age: 50,
    name: 'Sam'
};
let { age, name } = person
console.log(age);
console.log(name);50
Sam
struct Person {
	age  int
	name string
}
fn main() {
	person := Person{
		age: 50
		name: 'Sam'
	}
	age, name := person.age, person.name
	println(age)
	println(name)
}
50
Sam
let colors = ['Red', 'Green', 'Yellow', 'Blue', 'Purple']
let morecolors = ['White', ...colors]
console.log(morecolors);[ 'White', 'Red', 'Green', 'Yellow', 'Blue', 'Purple' ]
mut colors := ['Red', 'Green', 'Yellow', 'Blue', 'Purple']
mut morecolors := ['White']
// Not exactly equal to Javascript's spread
morecolors << colors
println(morecolors)
['White', 'Red', 'Green', 'Yellow', 'Blue', 'Purple']
// Variable arguments
function addition(...nums) {
    let total = 0;
    for (const num of nums){
        total += num
    }
    return total
}
console.log(addition(1,2,3,4,5));15
// Variable number of arguments
fn addition(nums ...int) int {
	mut total := 0
	for n in nums {
		total += n
	}
	return total
}
fn main() {
	println(addition(1, 2, 3, 4, 5))
}
15
let order1 = 'Salad 🥗 '
let order2 = 'Pizza 🍕'
console.log(`Wife ordered ${order1}, Husband ordered ${order2}`)
order2 = [order1, order1 = order2][0];
console.log(`They swapped and now Wife have ${order1}, husband have ${order2}`)Wife ordered Salad 🥗 , Husband ordered Pizza 🍕
They swapped and now Wife have Pizza 🍕, husband have Salad 🥗 
mut order1 := 'Salad 🥗'
mut order2 := 'Pizza 🍕'
println('Wife ordered $order1, Husband ordered $order2')
order1, order2 = order2, order1
println('They swapped and now Wife have $order1, husband have $order2')
Wife ordered Salad 🥗, Husband ordered Pizza 🍕
They swapped and now Wife have Pizza 🍕, husband have Salad 🥗
class Employee {
    constructor(id) {
        this.emp_id = id
        this.name = 'John'
        this.age = 0
        this.salary = 100
    }
    setSalary(salary) {
        return this.salary = salary
    }
    getEmail() {
        return 'some@email'
    }
}
const emp1 = new Employee(id = 100)
console.log(emp1.name)
console.log(emp1.salary);
emp1.setSalary(1000000)
console.log(emp1.salary);
console.log(emp1.getEmail());John
100
1000000
some@email
[params]
struct EmployeeConfig {
	id int
}
struct Employee {
mut:
	emp_id int
	name   string = 'John'
	age    int
	salary int = 100
}
fn (mut e Employee) set_salary(salary int) {
	e.salary = salary
}
fn (e Employee) get_email() string {
	return 'some@email'
}
fn get_emp(c EmployeeConfig) &Employee {
	return &Employee{
		emp_id: c.id
	}
}
fn main() {
	mut emp1 := get_emp(id: 100)
	println(emp1.name)
	println(emp1.salary)
	emp1.set_salary(1_000_000)
	println(emp1.salary)
	email := emp1.get_email()
	println(email)
}
John
100
1000000
some@email
Need help
// Current time
console.log(new Date().toLocaleString());
// Month names
const months = [...Array(12).keys()].map(key => new Date(0, key).toLocaleString('ta', { month: 'long' }))
console.log(months);
//Unix timestamp
console.log(Date.now());
let dateString = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
console.log(dateString);
const date1  = '2022-01-27';
const date2    = '2022-02-27';
const millis   = new Date(date2) - new Date(date1)
const days = millis / (1000 * 60 * 60 * 24);
console.log(millis);
console.log(days);8/20/2022, 8:16:47 PM
[
  'January',   'February',
  'March',     'April',
  'May',       'June',
  'July',      'August',
  'September', 'October',
  'November',  'December'
]
1661051807476
Aug 20, 2022
2678400000
31
import time
fn main() {
	println(time.now())
	println(time.long_months)
	println(time.utc().unix_time_milli())
	println(time.now().custom_format('MMM DD, YYYY'))
	// Diff between two dates
	mut date1 := '2022-01-27 00:00:00'
	mut date2 := '2022-02-27 00:00:00'
	// parse the date string to Time
	pt1 := time.parse(date1)?
	pt2 := time.parse(date2)?
	// Subtract and divide by 24
	millis := (pt2 - pt1).milliseconds() // hours between dates
	days := millis / (1000 * 60 * 60 * 24)
	println(millis)
	println(int(days))
}
2022-08-20 20:19:22
['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
1661051962639
Aug 20, 2022
2678400000
31
setTimeout(process, 5000)
function process() {
  console.log('Processing..')
}Processing..
import sync
import time
fn process(mut wg sync.WaitGroup) {
	defer {
		wg.done()
	}
	println('Processing..')
	time.sleep(5000 * time.millisecond)
}
fn main() {
	mut wg := sync.new_waitgroup()
	wg.add(1)
	go process(mut wg)
	wg.wait()
}
Processing..
const x = 'John';
(function (x) {
    console.log('Hello', x)
})(x)Hello John
fn main() {
	// anonymous functions
	fn (x string) {
		println('Hello $x')
	}('John')
}
Hello John
const fs = require('fs');
const readline = require('readline');
const path = require('path');
unix_time = Date.now()
const dir = __dirname;
const file_name = path.join(__dirname, 'file_sample.txt');
file_exist = fs.existsSync(file_name)
if (file_exist) {
    console.log('file_sample.txt exist');
} else {
    console.log('file_sample.txt not present');
}
let message = `${unix_time} - Log message \n`
fs.appendFile(file_name, message, function (err) {
    if (err) throw err;
})
var line_reader = readline.createInterface({
    input: require('fs').createReadStream(file_name)
});
line_reader.on('line', function (line) {
    console.log(line);
});
fs.rm(file_name, function (err) {
    if (err) throw err
})file_sample.txt not present
1661261346709 - Log message 
import os
import time
fn main() {
	unix_time := time.now().unix_time_milli().str()
	println(unix_time)
	abs_path := os.abs_path('file_sample.txt')
	// check if the file is present or not
	file_exist := os.exists(abs_path)
	if file_exist {
		println('file_sample.txt exist')
	} else {
		println('file_sample.txt not present')
	}
	mut append_file := os.open_append(abs_path) or { panic(err) }
	append_file.writeln('$unix_time - Log message')?
	append_file.close()
	mut read_file := os.open(abs_path)?
	mut buf := []u8{len: 100}
	for {
		buf_read := read_file.read_bytes_into_newline(mut buf) or { panic(err) }
		// convert bytes into string
		s := buf#[..buf_read].bytestr()
		if read_file.eof() {
			break
		}
		println(s)
	}
	read_file.close()
	os.rm(abs_path) or { panic(err) }
}
1661236319312
file_sample.txt not present
1661236319312 - Log message
let emplyee_1 = '{"name":"Yun", "id":87964, "email":"yun2020@someemail", "status":"active", "unused":"will be excluded"}'
let decode_emp = JSON.parse(emplyee_1)
console.log(decode_emp)
console.log(decode_emp.id)
console.log(decode_emp.name)
let encode_emp = JSON.stringify(decode_emp)
console.log(encode_emp);{
  name: 'Yun',
  id: 87964,
  email: 'yun2020@someemail',
  status: 'active',
  unused: 'will be excluded'
}
87964
Yun
{"name":"Yun","id":87964,"email":"yun2020@someemail","status":"active","unused":"will be excluded"}
import json
struct Emp {
	name   string
	id     int
	email  string
	status string
}
fn main() {
	emplyee_1 := '{"name":"Yun", "id":87964, "email":"yun2020@someemail", "status":"active", "unused":"will be excluded"}'
	mut decode_emp := json.decode(Emp, emplyee_1) or {
		println(err)
		return
	}
	println(decode_emp)
	println(decode_emp.id)
	println(decode_emp.name)
	mut encode_emp := json.encode(decode_emp)
	println(encode_emp)
}
Emp{
    name: 'Yun'
    id: 87964
    email: 'yun2020@someemail'
    status: 'active'
}
87964
Yun
{"name":"Yun","id":87964,"email":"yun2020@someemail","status":"active"}
function task(value) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Completed')
        }, 1e3)
    })
}
(function () {
    Promise.all([
        task(1),
        task(2),
        task(3)
    ])
        .then(result => console.log(result))
        .catch(err => console.error(err))
})()[ 'Completed', 'Completed', 'Completed' ]
import time
import rand
fn task(id int, duration int) string {
	time.sleep(duration * time.millisecond)
	println('task $id end')
	return 'Task $id completed in $duration milliseconds'
}
fn main() {
	mut threads := []thread string{}
	threads << go task(1, rand.int_in_range(1000, 10000)?)
	threads << go task(2, rand.int_in_range(1000, 10000)?)
	threads << go task(3, rand.int_in_range(1000, 10000)?)
	res := threads.wait()
	println(res)
}
task 1 end
task 3 end
task 2 end
['Task 1 completed in 2131 milliseconds', 'Task 2 completed in 8710 milliseconds', 'Task 3 completed in 4047 milliseconds']
const actors = [{ name: "John", age: 18 }]
function actor_by_name(name) {
    for (actor of actors) {
        if (actor.name === name) {
            return actor
        }
    }
    throw Error(`Actor ${name} not exist`)
}
(function () {
    try {
        console.log(actor_by_name('John'))
        console.log(actor_by_name('Angelina'))
        
    } catch (e) {
        console.log(e);
    }
})(){ name: 'John', age: 18 }
Error: Actor Angelina not exist
    at actor_by_name (/Users/vlang-for-nodejs-developers/examples/trycatch.js:10:11)
    at /Users/vlang-for-nodejs-developers/examples/trycatch.js:16:21
    at Object.<anonymous> (/Users/vlang-for-nodejs-developers/examples/trycatch.js:21:3)
    at Module._compile (node:internal/modules/cjs/loader:1120:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1174:10)
    at Module.load (node:internal/modules/cjs/loader:998:32)
    at Module._load (node:internal/modules/cjs/loader:839:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47
struct Actor {
	name string
	age  int
}
struct List {
	actors []Actor
}
fn (l List) by_name(name string) ?Actor {
	for a in l.actors {
		if a.name == name {
			return a
		}
	}
	return error('Employee $name not exist')
}
fn main() {
	actor := List{
		actors: [Actor{
			name: 'John'
			age: 18
		}]
	}
	actor_details := actor.by_name('John') or { panic(err) }
	println(actor_details)
	actor_details2 := actor.by_name('Angelina') or { panic(err) }
	println(actor_details2)
}Actor{
    name: 'John'
    age: 18
}
V panic: Employee Angelina not exist
v hash: 3bc01d6
0   trycatch                            0x000000010f7cf4cf main__main + 687
1   trycatch                            0x000000010f7d01ac main + 76
2   trycatch                            0x000000010f7a80b4 start + 52
3   ???                                 0x0000000000000001 0x0 + 1
const http = require('http');
const server = http.createServer(function (req, res) {
    var url = req.url;
    if (url === '/version') {
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify({
            data: 'node 16'
        }));
    } else {
        res.writeHead(404, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify({
            error: 'Not found'
        }));
    }
})
server.listen(8080, function () {
    console.log("Server running on 8080");
}); curl --get localhost:8080/version
{"data":"node 16"}
curl --get localhost:8080/unknowpath
{"error":"Not found"}
import vweb
struct App {
	vweb.Context
}
['/version'; get]
pub fn (mut app App) get_version() vweb.Result {
	return app.json({
		'version': 'V 0.3'
	})
}
fn main() {
	vweb.run(&App{}, 8080)
}
curl --get localhost:8080/version
{"version":"V 0.3"}
curl --get localhost:8080/unknowpath
404 Not Found
//exportmodule.js
const crypto = require('crypto')
module.exports = {
    get_random_num: () => Math.floor(Math.random() * 1000),
    get_random_uuid: () => crypto.randomUUID()
}
// module.js
const random = require('./exportmodule')
console.log(random.get_random_num());
console.log(random.get_random_uuid());616
079da02f-53e9-4d5c-b899-871c5d3081a1
//random/num.v
module random
import rand
// `pub` is similar to node`s module.exports
pub fn get_random_num() ?u32 {
	return rand.u32_in_range(1,1000)
}
//random/uuid.v
module random 
import rand
pub fn get_random_uuid() string{
	return rand.uuid_v4()
}
// module.v
// import module called random which is inside random folder
import random
fn main() {
	n := random.get_random_num() or { panic(err) }
	println(n)
	uuid := random.get_random_uuid()
	println(uuid)
}
785
b00c215e-375e-4737-932f-62908f48a167
- NPM helps to manage packages
 - By default npm uses npmjs.com to download packages
 - Install a package 
npm install packagename - To remove a package 
npm uninstall packagename - To publish a package 
npm publish - More information https://docs.npmjs.com/cli/v8/commands/npm
 
- Packages are maintained VPM
 - Modules can be installed directly from Git.
 - Install package 
v install packagename - Install from Git 
v install --git https://github.com/vlang/markdown - Remove package 
v remove packagename - More information on Vlang package management
 
const fs = require("fs");
// Stdout
console.log('Hello')
process.stdout.write('Hello \n')
//stderr
console.error('Some error')
process.stderr.write('Some error \n')
// read from stdin
const data = fs.readFileSync(0, "utf-8");
console.log(data);// run the command 
echo hello stdin | node examples/stdout.js 
Hello
Hello 
Some error
Some error 
hello stdin
import os
fn main() {
	println('Hello from println')
	mut o := os.stdout()
	o.writeln('Hello')?
	eprintln('Some error message')
	mut e := os.stderr()
	e.writeln('error')?
	mut i := os.stdin()
	mut d := i.read_bytes(100)
	println(d.bytestr())
}
// run the command
echo hello stdin | v run examples/stdout.v
Hello from println
Hello
Some error message
error
hello stdin
class NodeReaderError extends Error {
    constructor(app, ...params) {
        super(...params);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, NodeReaderError);
        }
        this.name = 'NodeReaderError';
        this.app = app;
        this.date = new Date()
    }
}
try {
    throw new NodeReaderError('Employee service', 'Database connection lost');
} catch (e) {
    throw e;
}/vlang-for-nodejs-developers/examples/customerror.js:17
    throw e;
    ^
NodeReaderError: Database connection lost
    at Object.<anonymous> (/vlang-for-nodejs-developers/examples/customerror.js:15:11)
    at Module._compile (node:internal/modules/cjs/loader:1120:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1174:10)
    at Module.load (node:internal/modules/cjs/loader:998:32)
    at Module._load (node:internal/modules/cjs/loader:839:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47 {
  app: 'Employee service',
  date: 2022-08-30T05:50:24.471Z
}
import time
struct NodeReaderError {
	Error
	path string
}
fn (err NodeReaderError) msg() string {
	return ' $time.now() : $err.path does not exist'
}
fn read_folder(path string) ? {
	return IError(NodeReaderError{
		path: path
	})
}
fn main() {
	read_folder('/files') or { panic(err) }
}
V panic: NodeReaderError:  2022-08-29 22:51:35 : /files does not exist
v hash: d75c62b
0   customerror                         0x0000000108af40f8 main__main + 168
1   customerror                         0x0000000108af51fc main + 76
2   customerror                         0x0000000108ac0594 start + 52
3   ???                                 0x0000000000000001 0x0 + 1
⬆ back to top <<<<<<< HEAD
const url = require('url');
const testUrl = url.parse('https://github.com/Thigidu/vlang-for-nodejs-developers#contents')
console.log(`Host: ${testUrl.hostname}`);
console.log(`Path: ${testUrl.pathname}`);
console.log(`Fragment: ${testUrl.hash}`);Host: github.com
Path: /Thigidu/vlang-for-nodejs-developers
Fragment: #contents
import net.urllib
fn main() {
	test_url := 'https://github.com/Thigidu/vlang-for-nodejs-developers#contents'
	u := urllib.parse(test_url) or { panic('unable to parse') }
	println('Host: $u.hostname()')
	println('Path: $u.path')
	println('Fragment: $u.fragment')
}
Host: github.com
Path: /Thigidu/vlang-for-nodejs-developers
Fragment: contents