Compare commits
No commits in common. "a5929c2d5e056377a47da46db86647882cee4d65" and "645cc1d7ca4109a662f76e6018db3a5070ae66c2" have entirely different histories.
a5929c2d5e
...
645cc1d7ca
|
@ -33,7 +33,7 @@ pub fn fetchOneAndUnpack(
|
||||||
var http_client: std.http.Client = .{ .allocator = allocator };
|
var http_client: std.http.Client = .{ .allocator = allocator };
|
||||||
defer http_client.deinit();
|
defer http_client.deinit();
|
||||||
|
|
||||||
const global_cache_directory: std.Build.Cache.Directory = .{
|
var global_cache_directory: std.Build.Cache.Directory = .{
|
||||||
.handle = try std.fs.cwd().makeOpenPath(cache_directory, .{}),
|
.handle = try std.fs.cwd().makeOpenPath(cache_directory, .{}),
|
||||||
.path = cache_directory,
|
.path = cache_directory,
|
||||||
};
|
};
|
||||||
|
@ -464,7 +464,7 @@ test "fetch and unpack" {
|
||||||
var http_client: std.http.Client = .{ .allocator = alloc };
|
var http_client: std.http.Client = .{ .allocator = alloc };
|
||||||
defer http_client.deinit();
|
defer http_client.deinit();
|
||||||
|
|
||||||
const global_cache_directory: std.Build.Cache.Directory = .{
|
var global_cache_directory: std.Build.Cache.Directory = .{
|
||||||
.handle = try std.fs.cwd().makeOpenPath("test-pkg", .{}),
|
.handle = try std.fs.cwd().makeOpenPath("test-pkg", .{}),
|
||||||
.path = "test-pkg",
|
.path = "test-pkg",
|
||||||
};
|
};
|
||||||
|
|
|
@ -37,7 +37,7 @@ pub fn main() anyerror!void {
|
||||||
try output_dir.writeFile("json.zig", json_zig);
|
try output_dir.writeFile("json.zig", json_zig);
|
||||||
|
|
||||||
// TODO: We need a different way to handle this file...
|
// TODO: We need a different way to handle this file...
|
||||||
const manifest_file_started = false;
|
var manifest_file_started = false;
|
||||||
var manifest_file: std.fs.File = undefined;
|
var manifest_file: std.fs.File = undefined;
|
||||||
defer if (manifest_file_started) manifest_file.close();
|
defer if (manifest_file_started) manifest_file.close();
|
||||||
var manifest: std.fs.File.Writer = undefined;
|
var manifest: std.fs.File.Writer = undefined;
|
||||||
|
@ -201,7 +201,7 @@ fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: anytype)
|
||||||
defer allocator.free(output_file_name);
|
defer allocator.free(output_file_name);
|
||||||
for (service_names) |name| {
|
for (service_names) |name| {
|
||||||
const seperator = if (output_file_name.len > 0) "-" else "";
|
const seperator = if (output_file_name.len > 0) "-" else "";
|
||||||
const new_output_file_name = try std.fmt.allocPrint(
|
var new_output_file_name = try std.fmt.allocPrint(
|
||||||
allocator,
|
allocator,
|
||||||
"{s}{s}{s}",
|
"{s}{s}{s}",
|
||||||
.{ output_file_name, seperator, name },
|
.{ output_file_name, seperator, name },
|
||||||
|
@ -211,7 +211,7 @@ fn processFile(file_name: []const u8, output_dir: std.fs.Dir, manifest: anytype)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// append .zig on to the file name
|
// append .zig on to the file name
|
||||||
const new_output_file_name = try std.fmt.allocPrint(
|
var new_output_file_name = try std.fmt.allocPrint(
|
||||||
allocator,
|
allocator,
|
||||||
"{s}.zig",
|
"{s}.zig",
|
||||||
.{output_file_name},
|
.{output_file_name},
|
||||||
|
@ -337,7 +337,7 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file:
|
||||||
var generated = std.StringHashMap(void).init(allocator);
|
var generated = std.StringHashMap(void).init(allocator);
|
||||||
defer generated.deinit();
|
defer generated.deinit();
|
||||||
|
|
||||||
const state = FileGenerationState{
|
var state = FileGenerationState{
|
||||||
.shape_references = shape_references,
|
.shape_references = shape_references,
|
||||||
.additional_types_to_generate = &unresolved,
|
.additional_types_to_generate = &unresolved,
|
||||||
.additional_types_generated = &generated,
|
.additional_types_generated = &generated,
|
||||||
|
@ -345,8 +345,8 @@ fn generateServices(allocator: std.mem.Allocator, comptime _: []const u8, file:
|
||||||
};
|
};
|
||||||
for (services.items) |service| {
|
for (services.items) |service| {
|
||||||
var sdk_id: []const u8 = undefined;
|
var sdk_id: []const u8 = undefined;
|
||||||
const version: []const u8 = service.shape.service.version;
|
var version: []const u8 = service.shape.service.version;
|
||||||
const name: []const u8 = service.name;
|
var name: []const u8 = service.name;
|
||||||
var arn_namespace: []const u8 = undefined;
|
var arn_namespace: []const u8 = undefined;
|
||||||
var sigv4_name: []const u8 = undefined;
|
var sigv4_name: []const u8 = undefined;
|
||||||
var endpoint_prefix: []const u8 = undefined;
|
var endpoint_prefix: []const u8 = undefined;
|
||||||
|
|
|
@ -365,7 +365,7 @@ pub fn Request(comptime request_action: anytype) type {
|
||||||
.raw_parsed = .{ .raw = .{} },
|
.raw_parsed = .{ .raw = .{} },
|
||||||
.allocator = options.client.allocator,
|
.allocator = options.client.allocator,
|
||||||
};
|
};
|
||||||
const body_field = @field(rc.response, action.Response.http_payload);
|
var body_field = @field(rc.response, action.Response.http_payload);
|
||||||
const BodyField = @TypeOf(body_field);
|
const BodyField = @TypeOf(body_field);
|
||||||
if (BodyField == []const u8 or BodyField == ?[]const u8) {
|
if (BodyField == []const u8 or BodyField == ?[]const u8) {
|
||||||
expected_body_field_len = 0;
|
expected_body_field_len = 0;
|
||||||
|
@ -875,7 +875,7 @@ fn FullResponse(comptime action: anytype) type {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (@hasDecl(Response, "http_payload")) {
|
if (@hasDecl(Response, "http_payload")) {
|
||||||
const body_field = @field(self.response, Response.http_payload);
|
var body_field = @field(self.response, Response.http_payload);
|
||||||
const BodyField = @TypeOf(body_field);
|
const BodyField = @TypeOf(body_field);
|
||||||
if (BodyField == []const u8) {
|
if (BodyField == []const u8) {
|
||||||
self.allocator.free(body_field);
|
self.allocator.free(body_field);
|
||||||
|
|
|
@ -140,7 +140,7 @@ fn getContainerCredentials(allocator: std.mem.Allocator) !?auth.Credentials {
|
||||||
var resp_payload = try std.ArrayList(u8).initCapacity(allocator, @intCast(req.response.content_length.?));
|
var resp_payload = try std.ArrayList(u8).initCapacity(allocator, @intCast(req.response.content_length.?));
|
||||||
defer resp_payload.deinit();
|
defer resp_payload.deinit();
|
||||||
try resp_payload.resize(@intCast(req.response.content_length.?));
|
try resp_payload.resize(@intCast(req.response.content_length.?));
|
||||||
const response_data = try resp_payload.toOwnedSlice();
|
var response_data = try resp_payload.toOwnedSlice();
|
||||||
defer allocator.free(response_data);
|
defer allocator.free(response_data);
|
||||||
_ = try req.readAll(response_data);
|
_ = try req.readAll(response_data);
|
||||||
log.debug("Read {d} bytes from container credentials endpoint", .{response_data.len});
|
log.debug("Read {d} bytes from container credentials endpoint", .{response_data.len});
|
||||||
|
@ -243,7 +243,7 @@ fn getImdsRoleName(allocator: std.mem.Allocator, client: *std.http.Client, imds_
|
||||||
log.warn("Unexpected empty response from IMDS endpoint post token", .{});
|
log.warn("Unexpected empty response from IMDS endpoint post token", .{});
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const resp = try allocator.alloc(u8, @intCast(req.response.content_length.?));
|
var resp = try allocator.alloc(u8, @intCast(req.response.content_length.?));
|
||||||
defer allocator.free(resp);
|
defer allocator.free(resp);
|
||||||
_ = try req.readAll(resp);
|
_ = try req.readAll(resp);
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ fn getImdsCredentials(allocator: std.mem.Allocator, client: *std.http.Client, ro
|
||||||
log.warn("Unexpected empty response from IMDS role endpoint", .{});
|
log.warn("Unexpected empty response from IMDS role endpoint", .{});
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const resp = try allocator.alloc(u8, @intCast(req.response.content_length.?));
|
var resp = try allocator.alloc(u8, @intCast(req.response.content_length.?));
|
||||||
defer allocator.free(resp);
|
defer allocator.free(resp);
|
||||||
_ = try req.readAll(resp);
|
_ = try req.readAll(resp);
|
||||||
|
|
||||||
|
@ -455,7 +455,7 @@ const LineIterator = struct {
|
||||||
pub fn next(self: *Self) ?[]const u8 {
|
pub fn next(self: *Self) ?[]const u8 {
|
||||||
if (self.inx >= self.text.len) return null;
|
if (self.inx >= self.text.len) return null;
|
||||||
var current = self.inx;
|
var current = self.inx;
|
||||||
const start = self.inx;
|
var start = self.inx;
|
||||||
for (self.text[self.inx..], 0..) |c, i| {
|
for (self.text[self.inx..], 0..) |c, i| {
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
// log.debug("got \\n: {d}", .{i});
|
// log.debug("got \\n: {d}", .{i});
|
||||||
|
@ -571,7 +571,7 @@ const EvaluatedPath = struct {
|
||||||
evaluated_path: []const u8,
|
evaluated_path: []const u8,
|
||||||
};
|
};
|
||||||
fn getDefaultPath(allocator: std.mem.Allocator, home_dir: ?[]const u8, dir: []const u8, file: []const u8) !EvaluatedPath {
|
fn getDefaultPath(allocator: std.mem.Allocator, home_dir: ?[]const u8, dir: []const u8, file: []const u8) !EvaluatedPath {
|
||||||
const home = home_dir orelse try getHomeDir(allocator);
|
var home = home_dir orelse try getHomeDir(allocator);
|
||||||
log.debug("Home directory: {s}", .{home});
|
log.debug("Home directory: {s}", .{home});
|
||||||
const rc = try std.fs.path.join(allocator, &[_][]const u8{ home, dir, file });
|
const rc = try std.fs.path.join(allocator, &[_][]const u8{ home, dir, file });
|
||||||
log.debug("Path evaluated as: {s}", .{rc});
|
log.debug("Path evaluated as: {s}", .{rc});
|
||||||
|
|
|
@ -255,7 +255,7 @@ pub const AwsHttp = struct {
|
||||||
try req.reader().readAllAlloc(self.allocator, std.math.maxInt(usize))
|
try req.reader().readAllAlloc(self.allocator, std.math.maxInt(usize))
|
||||||
else blk: {
|
else blk: {
|
||||||
// content length
|
// content length
|
||||||
const tmp_data = try self.allocator.alloc(u8, content_length);
|
var tmp_data = try self.allocator.alloc(u8, content_length);
|
||||||
errdefer self.allocator.free(tmp_data);
|
errdefer self.allocator.free(tmp_data);
|
||||||
_ = try req.readAll(tmp_data);
|
_ = try req.readAll(tmp_data);
|
||||||
break :blk tmp_data;
|
break :blk tmp_data;
|
||||||
|
|
|
@ -364,7 +364,7 @@ fn verifyParsedAuthorization(
|
||||||
const service = credential_iterator.next().?;
|
const service = credential_iterator.next().?;
|
||||||
const aws4_request = credential_iterator.next().?;
|
const aws4_request = credential_iterator.next().?;
|
||||||
if (!std.mem.eql(u8, aws4_request, "aws4_request")) return error.UnexpectedCredentialValue;
|
if (!std.mem.eql(u8, aws4_request, "aws4_request")) return error.UnexpectedCredentialValue;
|
||||||
const config = Config{
|
var config = Config{
|
||||||
.service = service,
|
.service = service,
|
||||||
.credentials = credentials,
|
.credentials = credentials,
|
||||||
.region = region,
|
.region = region,
|
||||||
|
@ -444,7 +444,7 @@ fn getSigningKey(allocator: std.mem.Allocator, signing_date: []const u8, config:
|
||||||
\\ region: {s}
|
\\ region: {s}
|
||||||
\\ service: {s}
|
\\ service: {s}
|
||||||
, .{ signing_date, config.region, config.service });
|
, .{ signing_date, config.region, config.service });
|
||||||
const secret = try std.fmt.allocPrint(allocator, "AWS4{s}", .{config.credentials.secret_key});
|
var secret = try std.fmt.allocPrint(allocator, "AWS4{s}", .{config.credentials.secret_key});
|
||||||
defer {
|
defer {
|
||||||
// secureZero avoids compiler optimizations that may say
|
// secureZero avoids compiler optimizations that may say
|
||||||
// "WTF are you doing this thing? Looks like nothing to me. It's silly and we will remove it"
|
// "WTF are you doing this thing? Looks like nothing to me. It's silly and we will remove it"
|
||||||
|
@ -716,7 +716,7 @@ fn canonicalQueryString(allocator: std.mem.Allocator, path: []const u8) ![]const
|
||||||
for (sort_me.items) |i| {
|
for (sort_me.items) |i| {
|
||||||
if (!first) try normalized.append('&');
|
if (!first) try normalized.append('&');
|
||||||
first = false;
|
first = false;
|
||||||
const first_equals = std.mem.indexOf(u8, i, "=");
|
var first_equals = std.mem.indexOf(u8, i, "=");
|
||||||
if (first_equals == null) {
|
if (first_equals == null) {
|
||||||
// Rare. This is "foo="
|
// Rare. This is "foo="
|
||||||
const normed_item = try encodeUri(allocator, i);
|
const normed_item = try encodeUri(allocator, i);
|
||||||
|
@ -744,7 +744,7 @@ fn canonicalQueryString(allocator: std.mem.Allocator, path: []const u8) ![]const
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace(allocator: std.mem.Allocator, haystack: []const u8, needle: []const u8, replacement_value: []const u8) ![]const u8 {
|
fn replace(allocator: std.mem.Allocator, haystack: []const u8, needle: []const u8, replacement_value: []const u8) ![]const u8 {
|
||||||
const buffer = try allocator.alloc(u8, std.mem.replacementSize(u8, haystack, needle, replacement_value));
|
var buffer = try allocator.alloc(u8, std.mem.replacementSize(u8, haystack, needle, replacement_value));
|
||||||
_ = std.mem.replace(u8, haystack, needle, replacement_value, buffer);
|
_ = std.mem.replace(u8, haystack, needle, replacement_value, buffer);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
@ -837,7 +837,7 @@ fn canonicalHeaders(allocator: std.mem.Allocator, headers: []base.Header, servic
|
||||||
|
|
||||||
fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]const u8 {
|
fn canonicalHeaderValue(allocator: std.mem.Allocator, value: []const u8) ![]const u8 {
|
||||||
var started = false;
|
var started = false;
|
||||||
const in_quote = false;
|
var in_quote = false;
|
||||||
var start: usize = 0;
|
var start: usize = 0;
|
||||||
const rc = try allocator.alloc(u8, value.len);
|
const rc = try allocator.alloc(u8, value.len);
|
||||||
var rc_inx: usize = 0;
|
var rc_inx: usize = 0;
|
||||||
|
@ -1002,7 +1002,7 @@ test "can sign" {
|
||||||
try headers.append(.{ .name = "Content-Type", .value = "application/x-www-form-urlencoded; charset=utf-8" });
|
try headers.append(.{ .name = "Content-Type", .value = "application/x-www-form-urlencoded; charset=utf-8" });
|
||||||
try headers.append(.{ .name = "Content-Length", .value = "13" });
|
try headers.append(.{ .name = "Content-Length", .value = "13" });
|
||||||
try headers.append(.{ .name = "Host", .value = "example.amazonaws.com" });
|
try headers.append(.{ .name = "Host", .value = "example.amazonaws.com" });
|
||||||
const req = base.Request{
|
var req = base.Request{
|
||||||
.path = "/",
|
.path = "/",
|
||||||
.query = "",
|
.query = "",
|
||||||
.body = "Param1=value1",
|
.body = "Param1=value1",
|
||||||
|
@ -1071,7 +1071,7 @@ test "can verify server request" {
|
||||||
|
|
||||||
var buf = "bar".*;
|
var buf = "bar".*;
|
||||||
var fis = std.io.fixedBufferStream(&buf);
|
var fis = std.io.fixedBufferStream(&buf);
|
||||||
const request = std.http.Server.Request{
|
var request = std.http.Server.Request{
|
||||||
.method = std.http.Method.PUT,
|
.method = std.http.Method.PUT,
|
||||||
.target = "/mysfitszj3t6webstack-hostingbucketa91a61fe-1ep3ezkgwpxr0/i/am/a/teapot/foo?x-id=PutObject",
|
.target = "/mysfitszj3t6webstack-hostingbucketa91a61fe-1ep3ezkgwpxr0/i/am/a/teapot/foo?x-id=PutObject",
|
||||||
.version = .@"HTTP/1.1",
|
.version = .@"HTTP/1.1",
|
||||||
|
|
16
src/date.zig
16
src/date.zig
|
@ -21,7 +21,7 @@ pub fn timestampToDateTime(timestamp: i64) DateTime {
|
||||||
const DAY_NUMBER_ADJUSTED_1970_01_01 = 719468; //* Day number relates to March 1st */
|
const DAY_NUMBER_ADJUSTED_1970_01_01 = 719468; //* Day number relates to March 1st */
|
||||||
|
|
||||||
var dayN: u64 = DAY_NUMBER_ADJUSTED_1970_01_01 + unixtime / SECONDS_PER_DAY;
|
var dayN: u64 = DAY_NUMBER_ADJUSTED_1970_01_01 + unixtime / SECONDS_PER_DAY;
|
||||||
const seconds_since_midnight: u64 = unixtime % SECONDS_PER_DAY;
|
var seconds_since_midnight: u64 = unixtime % SECONDS_PER_DAY;
|
||||||
var temp: u64 = 0;
|
var temp: u64 = 0;
|
||||||
|
|
||||||
// Leap year rules for Gregorian Calendars
|
// Leap year rules for Gregorian Calendars
|
||||||
|
@ -37,7 +37,7 @@ pub fn timestampToDateTime(timestamp: i64) DateTime {
|
||||||
|
|
||||||
// dayN calculates the days of the year in relation to March 1
|
// dayN calculates the days of the year in relation to March 1
|
||||||
var month = @as(u8, @intCast((5 * dayN + 2) / 153));
|
var month = @as(u8, @intCast((5 * dayN + 2) / 153));
|
||||||
const day = @as(u8, @intCast(dayN - (@as(u64, @intCast(month)) * 153 + 2) / 5 + 1));
|
var day = @as(u8, @intCast(dayN - (@as(u64, @intCast(month)) * 153 + 2) / 5 + 1));
|
||||||
// 153 = 31+30+31+30+31 Days for the 5 months from March through July
|
// 153 = 31+30+31+30+31 Days for the 5 months from March through July
|
||||||
// 153 = 31+30+31+30+31 Days for the 5 months from August through December
|
// 153 = 31+30+31+30+31 Days for the 5 months from August through December
|
||||||
// 31+28 Days for January and February (see below)
|
// 31+28 Days for January and February (see below)
|
||||||
|
@ -50,9 +50,9 @@ pub fn timestampToDateTime(timestamp: i64) DateTime {
|
||||||
year += 1;
|
year += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const hours = @as(u8, @intCast(seconds_since_midnight / 3600));
|
var hours = @as(u8, @intCast(seconds_since_midnight / 3600));
|
||||||
const minutes = @as(u8, @intCast(seconds_since_midnight % 3600 / 60));
|
var minutes = @as(u8, @intCast(seconds_since_midnight % 3600 / 60));
|
||||||
const seconds = @as(u8, @intCast(seconds_since_midnight % 60));
|
var seconds = @as(u8, @intCast(seconds_since_midnight % 60));
|
||||||
|
|
||||||
return DateTime{ .day = day, .month = month, .year = year, .hour = hours, .minute = minutes, .second = seconds };
|
return DateTime{ .day = day, .month = month, .year = year, .hour = hours, .minute = minutes, .second = seconds };
|
||||||
}
|
}
|
||||||
|
@ -275,10 +275,10 @@ fn secondsBetween(start: DateTime, end: DateTime) DateTimeToTimestampError!i64 {
|
||||||
return (try secondsBetween(new_start, end)) - seconds_into_start_year;
|
return (try secondsBetween(new_start, end)) - seconds_into_start_year;
|
||||||
}
|
}
|
||||||
const leap_years_between = leapYearsBetween(start.year, end.year);
|
const leap_years_between = leapYearsBetween(start.year, end.year);
|
||||||
const add_days: u1 = 0;
|
var add_days: u1 = 0;
|
||||||
const years_diff = end.year - start.year;
|
const years_diff = end.year - start.year;
|
||||||
// log.debug("Years from epoch: {d}, Leap years: {d}", .{ years_diff, leap_years_between });
|
// log.debug("Years from epoch: {d}, Leap years: {d}", .{ years_diff, leap_years_between });
|
||||||
const days_diff: i32 = (years_diff * DAYS_PER_YEAR) + leap_years_between + add_days;
|
var days_diff: i32 = (years_diff * DAYS_PER_YEAR) + leap_years_between + add_days;
|
||||||
// log.debug("Days with leap year, without month: {d}", .{days_diff});
|
// log.debug("Days with leap year, without month: {d}", .{days_diff});
|
||||||
|
|
||||||
const seconds_into_year = secondsFromBeginningOfYear(
|
const seconds_into_year = secondsFromBeginningOfYear(
|
||||||
|
@ -306,7 +306,7 @@ fn secondsFromBeginningOfYear(year: u16, month: u8, day: u8, hour: u8, minute: u
|
||||||
const normal_days_per_month: [12]u5 = .{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
const normal_days_per_month: [12]u5 = .{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||||
const days_per_month = if (current_year_is_leap_year) leap_year_days_per_month else normal_days_per_month;
|
const days_per_month = if (current_year_is_leap_year) leap_year_days_per_month else normal_days_per_month;
|
||||||
var current_month: usize = 1;
|
var current_month: usize = 1;
|
||||||
const end_month = month;
|
var end_month = month;
|
||||||
var days_diff: u32 = 0;
|
var days_diff: u32 = 0;
|
||||||
while (current_month != end_month) {
|
while (current_month != end_month) {
|
||||||
days_diff += days_per_month[current_month - 1]; // months are 1-based vs array is 0-based
|
days_diff += days_per_month[current_month - 1]; // months are 1-based vs array is 0-based
|
||||||
|
|
|
@ -2299,7 +2299,7 @@ pub const Parser = struct {
|
||||||
},
|
},
|
||||||
.ObjectValue => {
|
.ObjectValue => {
|
||||||
var object = &p.stack.items[p.stack.items.len - 2].Object;
|
var object = &p.stack.items[p.stack.items.len - 2].Object;
|
||||||
const key = p.stack.items[p.stack.items.len - 1].String;
|
var key = p.stack.items[p.stack.items.len - 1].String;
|
||||||
|
|
||||||
switch (token) {
|
switch (token) {
|
||||||
.ObjectBegin => {
|
.ObjectBegin => {
|
||||||
|
|
|
@ -260,7 +260,7 @@ const ParseContext = struct {
|
||||||
begin = prev_nl + 1;
|
begin = prev_nl + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const end = mem.indexOfScalarPos(u8, self.source, self.offset, '\n') orelse self.source.len;
|
var end = mem.indexOfScalarPos(u8, self.source, self.offset, '\n') orelse self.source.len;
|
||||||
return self.source[begin..end];
|
return self.source[begin..end];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user